个人Blog:dykang.top
UnitTest框架
断言:帮助我们查看实际结果和预期结果是否一致
UnitTest基本组成
TestCase:(测试用例)单个测试用例文件 TestSuite(测试套件):有多个测试用例文件,将多个TestCase一起打包、组装 TestRunner:用来执行TestSuite的 TestLoader:测试加载,对TestSuite增强 Fixture: 测试代码结构,将共同的操作放到这个代码里面
TestCase(测试用例)
是一个代码文件,来书写真正的用例代码
步骤
1.导包 import unitTest 2.自定义测试类(继承TestCase) 3.在测试类中书写测试方法(必须以test_开头) 4.执行测试用例
TestSuite & TestRunner
步骤
1.导包 import unittest
2.创建套件对象
suite = unittest.TestSuite()
3.使用套件对象添加用例方法 复制粘贴导包
方式一:
suite.addTest(测试类('测试方法')) # 一次只能添加一个测试方法
方式二:
suite.addTest(unittest.makeSuite(测试类名)) # 一次添加测试类中的所有测试方法 makeSuite可能会出错拼写
4.实例化运行对象
runner = unittest.TextTestRunner()
5.利用运行对象去执行套件对象
runner.run(suite)
案例
jw_01_test.py (TestCase)
import unittest
from tools import add
class TestAdd(unittest.TestCase):
def test_method01(self):
if add(1,2)==3: #判断实际结果和预期结果相同
print('测试通过')
else:
print('测试不通过')
def test_method02(self):
if add(2,2)==4: #判断实际结果和预期结果相同
print('测试通过')
else:
print('测试不通过')
def test_method03(self):
if add(1,3)==4: #判断实际结果和预期结果相同
print('测试通过')
else:
print('测试不通过')
tools.py
def add(a,b):
return a+b
jw_01_test_runner.py (TestSuite && TestRunner)
import unittest
from jw_01_test import TestAdd
unit = unittest.TestSuite()
unit.addTest(unittest.makeSuite(TestAdd))
runner = unittest.TextTestRunner()
runner.run(unit)
TestLocader(测试加载)
并对TestSUite功能补充;可以帮助我们指定加载哪些用例
步骤
1.导包 2.实例化测试加载对象并添加用例 -->得到的是suite对象 3.实例化运行对象 4.运行对象执行
可以将用例放到case文件夹中,通过loader加载路径中的文件(可以用通配符)
"TestLoader的使用"
import unittest
# 实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在的路径','用例的代码文件名') 相对路径 *
suite = unittest.TestLoader().discover('./case','jw*.py') #suite
# 实例化运行对象
runner = unittest.TextTestRunner()
runner.run(suite)
FixTure(测试夹具)
是一种将用例中,通用的代码逻辑进行封装 在某些特定情况下会自动执行
方法级别
每个测试方法执行前后都会自动调用的调用
#方法之前
def setUp(self):
每个测试方法执行之前执行
pass
#方法之后
def tearDown(self):
每个测试方法执行之后执行
pass
类级别
每个类执行前后被调用
#方法之前
@classmethod
def setUpClass(self):
每个类执行之前执行
pass
#方法之后
def tearDownClass(self):
每个类执行之后执行
pass
模块级别(了解)
模块:代码文件 在每个代码文件执行前后执行结构
#模块级别需要在类的外面直接定义函数
#代码文件之前
def setUpMoudle(self):
pass
#方法之后
def tearDownMoudle(self):
pass
断言
断言:让程序来代替人工去判断测试程序执行结果是否和预期一致
assertEqual
self.assertEqual(预期结果,实际结果) # 判断两者是否相等 1.相等,用例通过 2.不想等,用例不通过,抛出异常
assertIn
self.assertIn(预期结果,实际结果) #预期结果是否包含在实际结果中 1.包含,用例通过 连续 2.不包含,不通过,抛出异常 assertIn('admin','admin') √ assertIn('admin','adminnnnn') √
参数化
在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量 好处:相似的代码不需要多次书写 场景: 1.测试数据在json中 2.使用代码读取json文件,提取我们想要的数据 -->[(),()] 安装插件 pip install parameterized
import unittest
from parameterized import parameterized
from tools import add
# 组织测试数据
data = [
(3, 4, 7),
(4, 2, 6),
(3, 2, 5)
]
class TestLogin(unittest.TestCase):
# 使用装饰器的形式传参,在不改变原有方法对其进行改变
@parameterized.expand(data)
def test_login(self, a, b, expect): #参数要和data中的数据顺序保持一致
self.assertEqual(expect, add(a, b))
跳过测试用例
跳过:@unittest.skip('跳过原因') 条件跳过:@unittest.skipIf(满足跳过条件,'跳过原因')
测试报告
TextTestRunner (自带的) 只有单独运行TestCase的代码,才会生成测试报告 HTMLTestRunner (第三方运行对象) 步骤: 1.获取测试运行类模块,将其放在代码的目录中 2.导包 unittest 3.使用套件对象,加载对象,去添加用例方法 4.实例化第三方的运行对象,并运行套件对象
import unittest from HTMLTestRunner import HTMLTestRunner suite = unittest.defaultTestLoader.discover('.','jw_01_test.py') file = 'f1.html' with open(file, 'wb') as f: # 2:详细 标题:测试报告 python版本 runner = HTMLTestRunner(f,2,'测试报告','python 3.6.8') runner.run(suite)
中文组装生成测试报告
import unittest from HTMLTestRunnerCN import HTMLTestReportCN suite = unittest.defaultTestLoader.discover('.','jw_01_test.py') file = 'f1.html' with open(file, 'wb') as f: # 2:详细 标题:测试报告 python版本 runner = HTMLTestReportCN(f) runner.run(suite)
pytest流程![](https://img-blog.csdnimg.cn/direct/14390bb60eef42fbae138d5a7ae70c63.png)
wb方式:二进制写的方式打开文件