三步学会用 python+unittest 搭建简易的接口测试框架续集来咯
目录:
一、discover模式运行
二、例子
三、组织测试用例
四、跳过测试
五、数据驱动 DDT
一、discover模式运行
支持的命令行参数:● -v, --verbose
更详细地输出结果。
● -s, --start-directory directory
开始进行搜索的目录(默认值为当前目录 . )。
● -p, --pattern pattern
用于匹配测试文件的模式(默认为 test*.py )。
● -t, --top-level-directory directory
指定项目的最上层目录(通常为开始时所在目录)。
![45b6b0ea93204f2f70778925520f9640.png](https://i-blog.csdnimg.cn/blog_migrate/19b5dc1e06dbd5ea29c0ea6cdd75d9fe.jpeg)
二、例子
![2b364d7912c6617c548ffdd267416d72.png](https://i-blog.csdnimg.cn/blog_migrate/5938d928968ee03b7069e250b90e822b.jpeg)
这个是文件目录结构1、运行testcases 中所有用例
python -m unittest discover -s testcases -v2、匹配模式运行
只运行 testcases 目录下以 test_ 开头文件
python -m unittest discover -v -s testcases -p test_*.py
![1a810fbd5aeac83e68dff818efd628d6.png](https://i-blog.csdnimg.cn/blog_migrate/f2d473bd151de2268b318f31fa4240cd.jpeg)
三、组织测试用例
1、加载单个测试用例
from testcases.test_003 import TestDemo
from testcases.test004 import Demo4
import unittest
“”"
添加单个测试用例
“”"
def suite():
“”"
定义测试套件
:return:
“”"
s = unittest.TestSuite() # 管理测试套件的类
s.addTest(TestDemo(‘test_01’)) # 添加单个测试用例 TestDemo class名 传入 ‘test_01’ test_01 方法名
s.addTest(Demo4(‘test_02_update_topic’)) # 添加单个测试用例
return s
if name == ‘main’:
runner = unittest.TextTestRunner(verbosity=2) # 创建执行器 设置执行的日志级别为详细日志
# 获取测试套件
s = suite()
# 运行测试套件
runner.run(s)2、 从类中加载多个cases
def suites():
s = unittest.TestSuite() # 实例化测试套件类对象
loader = unittest.TestLoader() # 定义加载器
cases1 = loader.loadTestsFromTestCase(TestDemo) # 加载器加载 TestCase 类中的所有的测试方法
cases2 = loader.loadTestsFromTestCase(Demo4)
s.addTests(cases1) # 所有的测试方法添加到测试套件中 s.addTests(cases2) return s
if name == ‘main’:
runner = unittest.TextTestRunner(verbosity=2)# 创建执行器 设置执行的日志级别为详细日志
# 获取测试套件
# s = suite()
s = suites()
# 运行测试套件
runner.run(s)3、 从module文件中加载
def moduleSuite():
s = unittest.TestSuite()
loader = unittest.TestLoader()
cases = loader.loadTestsFromName(‘testcases.test_00
5’) # 文件路径, 从module中加载所有的TestCase
s.addTests(cases)
return s
if name == ‘main’:
runner = unittest.TextTestRunner(verbosity=2) # 创建执行器 设置执行的日志级别为详细日志
# 获取测试套件
# s = suite()
s = moduleSuite()
# 运行测试套件
runner.run(s)
![a4480b208dbad4b830d68f8be89c6f98.png](https://i-blog.csdnimg.cn/blog_migrate/76080427d28295c7334cdc74f2585f1f.jpeg)
四、跳过测试
● skip 直接跳过。● skipIf 加上跳过条件。● skipUnless 跳过条件,与if相反。
“”"
test fixture 测试脚手架
“”"
import unittest
class Demo5_1(unittest.TestCase):
“”"
每个测试用例执行之前和之后的操作
测试用例级别: setUp 定义每个用例运行之前的操作 tearDown 定义每个用例运行之后的操作 整个class 级别 setUpClass 运行class 之前 tearDownClass 运行class 之后 """ def setUp(self) -> None: print('运行方法之前') def tearDown(self) -> None: print("运行方法之后执行") @classmethod def setUpClass(cls) -> None: print('运行类里面所有的case 之前') @classmethod def tearDownClass(cls) -> None: print('运行类里面所有的case 之后') def test_run1(self): print("现在开始运行run1") def test_run2(self): print("现在开始运行run2")
class Demo5_2(unittest.TestCase):
def testcase1(self):
assert True
@unittest.skip('跳过此用例') def testcase2(self): assert True @unittest.skipIf(True, 'skipIf') def testcase3(self): assert True @unittest.skipUnless(False,'skipUnless') def testcase4(self): assert True
if name == ‘main’:
unittest.main(verbosity=2)
五、数据驱动 DDT
需要安装ddt 库https://ddt.readthedocs.io/en/latest/example.html
![c163630e74edd2b4c3235ad01d934955.png](https://i-blog.csdnimg.cn/blog_migrate/eae2b46d4c32adf0e9b96f768114f888.jpeg)
1、快速入门
@data 将会传入数据
“”"
基本使用方式
“”"
import unittest
from ddt import ddt,data
#在定义类名上面
@ddt 引入ddt 库@ddt
class TestDDT1(unittest.TestCase):
@data(1,2,3,4,5,6) def test_01(self,val): # val 会去取@data中传过来的值 print('hello world',val)
if name == ‘main’:
unittest.main(verbosity=2)
![c7393fd4763120b255c0c68e948f716b.png](https://i-blog.csdnimg.cn/blog_migrate/b47aa5fe2904a29c0af5a70707c7efc7.jpeg)
2、读取数据文件https://github.com/datadriventests/ddt/blob/master/test/data/test_data_dict.json
data/data.json
{
“unsorted_list”: [ 10, 12, 15 ],
“sorted_list”: [ 15, 12, 50 ],
“tuple_data”: [1,2,3]
}
“”"
基本使用方式
“”"
import unittest
from ddt import ddt,file_data
#在定义类名上面
@ddt 引入ddt 库@ddt
class TestDDT1(unittest.TestCase):
@file_data('data/data.json') def test_02(self,value): print(value) assert True
if name == ‘main’:
unittest.main(verbosity=2)
data/data2.json
{
“positive_integer_range”: {
“start”: 0,
“end”: 2,
“value”: 1
},
“negative_integer_range”: {
“start”: -2,
“end”: 0,
“value”: -1
},
“positive_real_range”: {
“start”: 0.0,
“end”: 1.0,
“value”: 0.5
},
“negative_real_range”: {
“start”: -1.0,
“end”: 0.0,
“value”: -0.5
}
}
import unittest
from ddt import ddt,file_data
@ddt
class TestDDT2(unittest.TestCase):
@file_data('data/data2.json') def test_file_data(self,start,end,value): # start,end,value 与数据文件保持一致 print(start,end,value) assert True
if name == ‘main’:
unittest.main(verbosity=2)
![339946717b478ecc2cdd5c703a8111fd.png](https://i-blog.csdnimg.cn/blog_migrate/06bddf6a14c63da5e56bc07a2eb207fd.jpeg)