文章目录
部分内容来自此篇博客
此文做了部分修改,维护了文章中一些有问题的地方,后续此文将继续增加内容
1.介绍
unittest 是 python 自带的一个依赖包,类似 junit,其中有各种 py 文件,有各种类和方法可使用
python 中 unittest 就好像 java 中的 junit 主要用来做单元测试的,但实际上 junit 去做 web 自动化测试的管理可不可以呢?也行,但是目前主流被 testng 所占领,那 unittest 呢?也行,python 市场 web 自动化一般是 unittest 或者 pytest 使用都很多,pytest 类似于 java 中的 testng
2.unittest 包中的类与方法
unittest 可与 java 的 junit 或者 testng 做对比
-
unittest.TestCase
类
是所有测试用例类都继承的基本类,这样大家自己写的各个测试用例才方便被 unittest 工具管控调度,就好像 java web 自动化中测试用例继承 BaseTest 一样,BaseTest 中通过使用 testng 提供的注解,进而来管控调度测试用例(BaseTest 的子类) -
unittest.main()
使用它,可以方便的将一个单元测试模块变成一个可直接运行的测试脚本。其原理是 main() 使用了 TestLoader 类搜索所有模块中以 test 命名开头的测试方法,自动执行它们,顺序按照 ascall 码顺序
-
unittest.TestSuite
类用来创建测试套
-
unittest.TextTextRunner
类主要是通过该类下方的
run()
方法运行 suite 测试套组装起来的测试用例,入参为 suite 测试套 -
unittest.defaultTestLoader()
类主要是该类下有
discover()
方法可以自动根据测试目录匹配查找 test*.py 的用例文件,并把查找的文件用例组装到测试套中 -
unittest.skip()
装饰器用例运行时候,添加此装饰器的用例可以跳过,
@unittest.skip(说明原因)
是无条件跳过,@unittest.skipIf(条件语句, 说明原因)
条件为真时跳过,@unittest.skipUnless(条件语句, 说明原因)
条件为假时跳过,@unittest.expectedFailure()
测试标记为失败
2.1 unittest 包的 TestCase 类中
-
setUp()
在 test 测试点方法前执行,因为继承了 unittest.TestCase 的类会识别 test 开头的方法为测试点,test 开头的方法假如看成 testng 中的
@Test
那么 setUp 就可以看成@BeforeTest
表示在每个@Test
之前执行。可以把数据库连接操作,驱动初始化等放在里头 -
tearDown()
与
setUp()
是对应的,setUp()
相当于@BeforeTest
,那么tearDown()
就相当于@AfterClass
,常用来释放资源操作 -
assert*()
assert 打头的各种断言方法
2.2 unittest 包的 TestSuite 类中
-
addTest()
将测试用例添加到测试套件中,如下
# 利用 unittest 包中的 TestSuite 类生成一个 suite 测试套 suite = unittest.TestSuite() # 将 baidu_case.py 测试用例中 BaiduCase 类中的 test_1 测试方法添加到 suite 测试套中 suite.addTest(baidu_case.BaiduCase("test_1"))
2.3 unittest 包的 TextTextRunner 类中
-
run()
运行测试套
runner = unittest.TextTextRunner() runner.run(suite)
2.4 unittest 包的 defaultTestLoader 类中
-
discover()
自动根据测试目录识别 test 打头的
.py
文件为测试用例,并将找到的测试用例装到测试套中discover = unittest.defaultTestLoader.discover(test_dir, pattern = "test_*.py")
unittest 中不得不注意的点
unittest,main()
方法会执行当前模块中所有 test 打头的方法,但是有人会发现在第一个 test 打头的方法中 self.arg 的方式来初始化一个变量,在第二个 test 方法中却没法 self.arg 找到这个变量。unittest.main()
每次执行到一个新的 test 方法实际上是初始化一个新对象,所以这个 self.arg 是两个对象的变量