selenium~使用unittest测试框架,批量执行测试脚本,addTest、makeSuite、TestLoader、discover的使用

it2023-04-10  71

文章目录

unittest框架解析准备工作addTest() 的应用makeSuite()和TestLoader()的应用makeSuite()TestLoader() discover()的应用

unittest框架解析

unittest 是python 的单元测试框架, 在python 的官方文档中,对unittest有详细的介绍,想更深一步研究的同学可以到https://www.python.org/doc/ 去了解。unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import unittest 就可以使用。作为单元测试的框架, unittest 也是可以对程序最小模块的一种敏捷化的测试。在自动化测试中,我们虽然不需要做白盒测试,但是必须需要知道所使用语言的单元测试框架。利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元, 由测试容器组织起来,到时候直接执行,同时引入测试报告.

准备工作

敲好来个测试类, 继承unittest.TestCasetest1.py文件 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoAlertPresentException import unittest import time import re class TestBaiDu1(unittest.TestCase): # setUp用来初始化环境 每执行一个测试方法都会先执行这个方法 # self表示这个类的实例 def setUp(self) -> None: self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.base_url = "http://www.baidu.com" # 测试用例必须用test开头 def test_baiDuSearch(self): driver = self.driver driver.get(self.base_url + "/") driver.find_element_by_id("kw").click() driver.find_element_by_id("kw").clear() # u表示字符编码 driver.find_element_by_id("kw").send_keys(u"测试") driver.find_element_by_id("su").click() driver.find_element_by_id("su").click() def test_hao(self): driver = self.driver driver.get(self.base_url + "/") driver.find_element_by_link_text("hao123").click() # 清除环境工作 每执行完一个测试用例都会执行这个 def tearDown(self) -> None: time.sleep(3) self.driver.close() if __name__ == "__main__": # 执行测试用例 unittest.main() test2.py文件 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoAlertPresentException import unittest, time, re class TestBaiDu2(unittest.TestCase): def setUp(self) -> None: self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.base_url = "http://www.baidu.com" def test_baiDuSearch(self): driver = self.driver driver.get(self.base_url + "/") driver.find_element_by_id("kw").click() driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys(u"詹姆斯") driver.find_element_by_id("su").click() driver.find_element_by_id("su").click() def tearDown(self) -> None: time.sleep(3) self.driver.close() if __name__ == "__main__": unittest.main()

addTest() 的应用

当有多个或者几百测试用例的时候, 这样就需要一个测试容器( 测试套件) ,把测试用例放在该容器中进行执行,unittest 模块中提供了TestSuite 类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中。AddTest.py文件 import unittest, csv import test1, test2 import os, sys import time # 手工添加测试用例到套件 def createSuite(): # 初始化一个测试套件 suite = unittest.TestSuite() # 将测试用例添加到测试套件中 suite.addTest(test1.TestBaiDu1("test_baiDuSearch")) suite.addTest(test1.TestBaiDu1("test_hao")) suite.addTest(test2.TestBaiDu2("test_baiDuSearch")) return suite if __name__ == "__main__": suite = createSuite() # 2表示显示详细信息 runner = unittest.TextTestRunner(verbosity=2) # 执行测试套件 runner.run(suite)

makeSuite()和TestLoader()的应用

上述addTest有一个不方便的就是如果一个类有十几个甚至几十个测试用例, 如果每一次多add一次的话就太麻烦了, 所以就有makeSuite()和TestLoader()他们会自动加载你输入的类中的所有此时用例

makeSuite()

在unittest 框架中提供了makeSuite() 的方法,makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite ,unittest 调用makeSuite的时候,只需要把测试类名称传入即可。makeSuitTest.py文件 import unittest, csv import os, sys import time import test1 import test2 # 手工添加案例到套件, def createSuite(): suite = unittest.TestSuite() # 将测试用例加入到测试容器(套件)中 suite.addTest(unittest.makeSuite(test1.TestBaiDu1)) suite.addTest(unittest.makeSuite(test2.TestBaiDu2)) return suite if __name__ == "__main__": suite = createSuite() runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)

TestLoader()

TestLoader 用于创建类和模块的测试套件,一般的情况下,TestLoader().loadTestsFromTestCase(TestClass)来加载测试类。TestLoaderTest.py文件 import unittest, csv import os, sys import time import test1 import test2 # 手工添加案例到套件, def createSuite(): suite = unittest.TestSuite() # 将测试用例加入到测试容器(套件)中 suite1 = unittest.TestLoader().loadTestsFromTestCase(test1.TestBaiDu1) suite2 = unittest.TestLoader().loadTestsFromTestCase(test2.TestBaiDu2) suite = unittest.TestSuite([suite1, suite2]) return suite if __name__ == "__main__": suite = createSuite() runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)

discover()的应用

discover 是通过递归的方式到其子目录中从指定的目录开始, 找到所有测试模块并返回一个包含它们对象的TestSuite ,然后进行加载与模式匹配唯一的测试文件,discover 参数分别为 discover(dir,pattern,top_level_dir=None)TestDiscover.py文件 import unittest, csv import os, sys import time # 手工添加案例到套件, def createSuite(): # 第一个参数是扫描的路径 ../表示回到父路径, 然后递归扫描20201020这个文件下的文件 # 第二个参数进行匹配test开头的.py结尾的文件, 如果匹配就加载里面的内容 # 第三个参数表示测试模块的顶层目录,如果没有顶层目录,默认为None;一般都是为None discover = unittest.defaultTestLoader.discover('../20201020', pattern='test*.py', top_level_dir=None) print(discover) return discover if __name__ == "__main__": suite = createSuite() runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
最新回复(0)