当前位置:网站首页>unittest框架
unittest框架
2022-08-02 14:15:00 【keer丶】
unittest 基本使用
unittest框架
是python自带的一个单元测试框架,不需要单独安装。
使用的原因
1.能够组织多个用例去执行 2.提供丰富的断言方法 3.能够生成测试报告
核心要素
1.TestCase--测试用例,是unittest的组成部分,是用来书写真正的用例代码 2.TestSuite--测试套件,是用来组装TestCase的,可以将多个用例脚本文件组装到一起 3.TestRunner--测试执行,是用来执行TestSuite的 4.TestLoader--测试加载,是对TestSuite功能的补充 5.Fixture--测试夹具,是一种代码结构,书写前置方法和后置方法的代码
TestCase测试用例
步骤
1.导包 unittest 2.定义测试类 3.书写测试方法 4.执行:鼠标放在类名后边右键运行,运行该类所有的测试用例,放在类下的方法名后边,只运行该方法。
注意事项
1.代码文件名字要满足标识符的规则 2.代码文件名不要使用中文
实例
import unittest # 2.定义测试类 class TestDemo(unittest.TestCase): # 3.书写测试方法 def test001_demo(self): print('测试方法1') def test002_demo(self): print('测试方法2') # 4.执行 # 4.1在类名或方法名后边运行,鼠标放在类名后边右键运行,运行该类所有的测试用例,放在类下的方法名后边,只运行该方法。 # 4.2使用unittest.main运行 if __name__ == '__main__': unittest.main()
常见错误
1.py文件名字带中文,需要将文件名改为英文下划线等。 2.右键没有unittest for 运行
####
TestSuite和TestRunner
testsuite(测试套件)
将多条用例脚本集合在一起,就是套件,即用来组装用例的
1.导包 unittest 2.实例化套件对象 unittest.TestSuite() 3.添加用例方法
TestRunner
用来执行套件对象的
1.导包 unittest 2.实例化执行对象 unittest.textTestRunner() 3.执行对象去执行套件对象
整体步骤
1.导包 unittest 2.实例化套件对象 suite = unittest.TestSuite() 3.添加用例方法 3.1 suite.addTest(用例类名('用例方法名')) --一次性只能添加一个方法 3.2 suite.addTest(unittest.makeSuite(用例类名)) ----一次性只能添加一个类 4.实例化执行对象 runner = unittest.textTestRunner() 5.执行对象去执行套件对象 runner.run(suite)
代码案例
# 1.导包 unittest import unittest # 2.定义测试类 class TestDemo1(unittest.TestCase): # 3.书写测试方法 def test001_demo(self): print('测试方法1-1') def test002_demo(self): print('测试方法1-2')
# 1.导包 unittest import unittest from test_unittest.test_testcase1 import TestDemo1 #另外一个测试用例文件中的类 from test_unittest.test_testcase2 import TestDemo2 #另外一个测试用例文件中的类 # 2.实例化套件对象 unittest.TestSuite() suite = unittest.TestSuite() # 3.添加用例方法 #3.1 #suite.addTest(TestDemo1('test001_demo')) #此种方式为单个添加,格式:类名('方法名') #suite.addTest(TestDemo1('test002_demo')) #suite.addTest(TestDemo2('test001_demo')) #suite.addTest(TestDemo2('test002_demo')) # 3.2添加整个测试类 suite.addTest(unittest.makeSuite(TestDemo1)) suite.addTest(unittest.makeSuite(TestDemo2)) # 4.实例化执行对象 unittest.textTestRunner() runner = unittest.TextTestRunner() # 5.执行对象去执行套件对象 runner.run(suite)
####
TestLoader测试加载
作用和TestSuite一样,组装用例代码,同样也需要TestRunner()去执行
1.导包 unittest 2.实例化加载对象并加载用例 --->得到的是 套件对象 3.实例化执行对象并执行
代码示例
# 1.导包 unittest import unittest # 2.实例化加载对象并加载用例 --->得到的是 套件对象 suite = unittest.TestLoader().discover(r'./','test_testcase*.py') #3.实例化执行对象并执行 runner = unittest.TextTestRunner() runner.run(suite)
Fixture
是一种在用例执行前后会自动执行的代码结构
方法级别的fixture
在每个用例执行前后都会自动调用,方法名是固定的
def setUp(self): #前置,每个用例执行前都会自动调用 方法体 def tearDown(self): #后置,每个用例执行后都会自动调用 方法体
类级别的fixture
在类中所有的测试方法执行前后,自动执行一次
@classmethod def setUpClass(cls): #前置 方法体 def tearDownClass(cls): #后置 方法体
模块级别的fixture(了解)
模块就是整个代码文件 模块级别,在这个代码文件执行前后执行一次
#在类外部定义 def setUpModule(): pass def tearDownModule(): pass
断言
让程序代替认为判断测试程序执行结果是否符合预期结果的过程
序号 | 断言方法 | 断言描述 |
---|---|---|
1 | assertEqual(expected,actual,msg=None) | 验证expected==actual,不等则fail |
2 | assertIn(member,container,msg=None) | 验证是否member in container |
参数化
安装parameterized :pip install parameterized
--通过参数的方式来传递数据,从而实现数据和脚本分离,可以实现用例的重复执行,unittest本身不知处参数化,需要通过安装扩展插件parameterized来实现。
1.导包:from parameterized import parameterized 2.定义测试方法,将测试方法中的测试数据使用变量表示 3.组织测试数据格式,[(),(),()],一个元组就是一组数据 4.参数化,在测试方法上使用装饰器@parameterized.expend(测试数据) 5.运行代码
from parameterized import parameterized import unittest from test_unittest.util import add #导入add方法,就是简单的加法 data=[(1,1,2),(1,2,3),(2,3,5),(1,1,3)] #数据在一个文件内 class TestAdd(unittest.TestCase): @parameterized.expand(data) def test_add(self,a,b,expect): self.assertEqual(expect,add(a,b)) suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestAdd)) runner = unittest.TextTestRunner() runner.run(suite)
数据在json文件内
# json文件 testdata.json [ {"a":1,"b":2,"expect":3}, {"a":1,"b":3,"expect":4}, {"a":1,"b":2,"expect":3}, {"a":1,"b":2,"expect":5}, {"a":2,"b":2,"expect":4} ]
#工具文件 util.py import json #加法方法 def add(a,b): return a+b #读取json文件,转换成[(1,1,2),(),()]格式 def load_data(): with open(r'testdata.json','r',encoding='utf-8') as f: data_list = json.load(f) #读取文件并转成[{"k":"v"},{"k":"v"}] test_data = [] for item in data_list: a = item.get('a') b = item.get('b') expect = item.get('expect') test_data.append((a,b,expect)) #(a,b,expect)=====>(1,2,3) return test_data
from parameterized import parameterized #导入parameterized import unittest #导入unittest from test_unittest.util import add, load_data #导入util中的方法 class TestAdd(unittest.TestCase): @parameterized.expand(load_data()) def test_add(self,a,b,expect): self.assertEqual(expect,add(a,b)) suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestAdd)) runner = unittest.TextTestRunner() runner.run(suite)
测试报告
HTML测试报告:就是执行完测试用例后,以HTML方式将执行结果生成报告,本质是TestRunner
使用HTMLTestReport --安装 pip install HTMLTestReport
1.导包 unittest HTMLTestReport --- from htmltestreport import HTMLTestReport 2.组装用例(套件or TestLoader) 3.使用HTMLTestReport 中的runner执行套件 4.查看报告
from parameterized import parameterized import unittest from test_unittest.util import add, load_data from htmltestreport import HTMLTestReport class TestAdd(unittest.TestCase): @parameterized.expand(load_data()) def test_add(self,a,b,expect): self.assertEqual(expect,add(a,b)) suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestAdd)) runner = HTMLTestReport(r'./report.html','测试用例报告','这里是一个描述') runner.run(suite)
边栏推荐
猜你喜欢
随机推荐
打包项目上传到PyPI
tcp transparent proxy (IP_TRANSPARENT)
为什么Volatile能保证双重检查锁的线程安全
基类和派生类的关系【继承】/多态和虚函数/【继承和多态】抽象类和简单工厂
shader入门精要2
戴森球计划这个游戏牛逼
Google AdSense注册流程
【软件测试】项目中关于测试人员的简单介绍
使用三个线程,按顺序打印X,Y,Z,连续打印10次
内存和硬盘、磁盘的区别
许多代码……
【软件测试】selenium自动化测试1
OpenPose 命令行说明
Feign Client 超时时间配置不生效
【线程】 理解线程(并行)线程同步的处理(信号量,互斥锁,读写锁,条件变量)
消息队列的技术选型
Technical Selection of Message Queuing
深入理解负载均衡
Evaluate multipath BBR congestion control on ns3
企业的电子签名、私钥签名