装饰器
@unittest.skip() | 不执行这条用例 |
@unittesr.skipif(True) | 条件为真 不执行这条用例 |
@unittesr.skipiUnless(False) | 条件为假 不执行这条用例 |
@unittesr.expectedFailure() | 就算这个测试用例不通过也不算没通过 |
运行结果说明
. | 运行通过 |
F | 运行不通过 |
s | 不运行 |
x | @unittesr.expectedFailure()认为是错的确实是错的 |
u | @unittesr.expectedFailure()认为是错的但是是对的 |
unittest的清理函数
- python3.1 添加了 addCleanup 和 doCleanups
- python3.9 添加了 addClassCleanup 和 doClassCleanups
- 清理函数的使用需要自己封装一个方法,这个方法里面写的代码就是用来清理作用
- addCleanup写在setUp或者具体测试用例前都可以,但默认在tearDown后运行,
- doClearnup方法 可自行执行清理函数
import unittest
def myClasscleanup():
print("我的类清理函数")
def mycleanup():
print("我的清理函数")
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("setUpClass 方法")
def setUp(self):
print("setUp 方法")
self.addCleanup(myClasscleanup)
self.addCleanup(mycleanup)
def test_01(self):
self.assertEqual(1,1,"测试失败")
print('test01 第1个测试用例')
def test_02(self):
self.assertNotEqual(1,2,"测试失败")
print('test02 第2个测试用例')
self.doCleanups() ## 在test_02中任意位置插入清理函数的使用,则其在teardown前就运行了
def test_03(self):
self.assertNotEqual(1,2,"测试失败")
print('test03 第3个测试用例')
def tearDown(self) -> None:
print("tearDown 方法")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass 方法")
if __name__ == "__main__":
unittest.main()
运行结果
子测试
subTest
- 使用sunTest可以让unittest的测试用例支持数据驱动的测试方式
- 子测试会把所有的测试数据的失败结果抛出,方便定位
- 子测试写法固定
ddt: @ddt、@data、@file_data、@unpack
- ddt是实现数据驱动的第三方包
import unittest
import HTMLTestRunner
from ddt import ddt,data,unpack,file_data
def readTxt(filename):
datas = []
with open(filename,"r",encoding='utf-8') as f:
for data in f.readlines():
data = data.replace('\n','').split(',')
datas.append(data)
return datas
@ddt ##声明使用了 ddt
class TestDemo(unittest.TestCase):
@data((1,2),(1,1),(2,3)) ## 存数据
def test_01(self,value): #value接收data里的数据
'''测试用例01'''
self.assertEqual(value[0],value[1],"测试失败")
@data({"age":17,"name":"angela"},{"age":12,"name":"angela1"},{"age":17,"name":"angela2"})
@unpack ## 解析元组方便
def test_02(self, name,age): # 直接写元组的key值方便
'''测试用例02'''
self.assertEqual(age, 17, "测试失败")
@file_data("data.json") ## 读取文件数据,支持json,yaml
@unpack
def test_03(self, name, age):
self.assertEqual(age, 17, "测试失败")
@data(*readTxt('data.txt')) ## 从txt读取数据
def test_04(self,value): #value接收data里的数据
'''测试用例04'''
self.assertEqual(value[0],value[1],"测试失败")
if __name__ == "__main__":
suite = unittest.defaultTestLoader.discover('./', pattern='unitMytest_subtest.py')
with open(r'./res.html','wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(f,title = "单元测试",description="测试报告")
runner.run(suite)
print(suite)
运行结果