1. unittest框架
在自动化测试中使用, 管理执行测试用例
框架:
1)framework
2)为了解决一类事情的功能集合
是python自带的单元测试框架,无需安装
使用的原因:
- 1)能够组织多个用例去执行
- 2)提供丰富的断言方法
- 3)能够生成测试报告
核心要素
- TestCase 测试用例
- Testsuite 测试套件,作用是用来组装打包TestCase的
- TestRunner 测试执行,作用是用例执行TestSuite的
- TestLoader 测试加载,是对testsuite的功能补充
- Fixture 测试夹具,是一种代码结构, 书写前置方法(执行用例之前的方法)和后置方法(执行用例之后的方法),即用例执行顺序,前置--->用例-->后置
步骤:
- 导包
- 定义测试类,需要继承unittest.TestCase类,习惯性类名以Test开头
- 书写测试方法,必须以test开头
- 执行
import unittest
# 定义测试类, 只要继承unittest.TestCase类,就是测试类
class TestDemo(unittest.TestCase):
# 书写测试方法,方法中的代码就是真正用户代码, 方法名必须以test开头
def test_method1(self):
print("测试方法一")
def test_method2(self):
print("测试方法二")
# 执行:
# 1.在类名右键执行,执行类中的所有测试方法
# 2.在方法名右侧执行,只执行当前的测试方法
if __name__ == '__main__':
unittest.main()
2. TestRunner(测试执行)
用来执行测试套件
- 导包 unittest
- 实例化 执行对象 unittest.TextTestRunner()
- 执行对象执行 套件对象 执行对象.run(套件对象)
3. 整体步骤
- 导包 unittest
- 实例化套件对象 unittest.TestSuite()
- 添加用例方法 套件对象.addTest(测试类名('测试方法名'))
- 实例化 执行对象 unittest.TextTestRunner()
- 执行对象执行 套件对象 执行对象.run(套件对象)
# 1.导包
import unittest
from hm_02_testcase1 import TestDemo1
from hm_02_testcase2 import TestDemo2
# 2.实例化套件对象
suite = unittest.TestSuite()
# 3.添加用例方法
# suite.addTest(TestDemo1('test_method1'))
# suite.addTest(TestDemo2('test_method2'))
suite.addTest(unittest.makeSuite(TestDemo1))
# 4.实例化执行对象
runner = unittest.TextTestRunner()
# 5.执行对象执行套件对象
runner.run(suite)
4. TestLoader测试加载
将2和3 合成一步
# 1. 导包
import unittest
# 2. 实例化加载对象并加载用例,得到套件对象
suite = unittest.TestLoader().discover('.','hm_02*.py')
# 3. 实例化执行对象
runner = unittest.TextTestRunner()
# 4. 执行
runner.run(suite)
5. Fixture
1)方法级别的fixture
每个用例执行前后都会自动调用,方法名是固定的
def setUp(self): # 方法前置
pass
def tearDown(self): # 方法后置
pass
2)类级别的fixture
在类中所有的测试方法执行前后,会自动执行的代码,只执行一次
@classmethod
def setUpClass(cls):
pass
def tearDownClass(cls):
pass
在用例脚本中,使用断言(使用代码自动判断预期结果和实际结果是否相等)
参数化(将测试数据定义到json文件)
跳过(某些用例由于某种原因不想执行,设置为跳过)
6. 断言
asserEqual(预期结果,实际结果)
判断预期结果和实际结果是否相等, 如果相等, 用例通过,如果不相等,抛出异常,用例不通过
assertIn(预期结果,实际结果)
判断预期结果是否包含在实际结果中, 如果存在,用例通过,如果不存在,抛出异常,用例不通过
import unittest
class TestAssert(unittest.TestCase):
def test_equal_1(self):
self.assertEqual(10,10)
def test_in(self):
self.assertIn("admin","1admin")
import unittest
from test_demo4 import TestAssert
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAssert))
unittest.TextTestRunner().run(suite)
7. 参数化:
通过参数的方式来传递数据,从而实现数据和脚本分离。 并且可以实现用例的重复执行。
unittest 测试框架,本身不支持参数化,但是可以通过安装unittest 扩展插件parameterized来实现。
使用:
1.导包,from parameterized import parameterized
2. 修改测试方法,将测试方法中的测试数据使用变量表示
3. 组织测试数据, 格式[(),(),()],一个元组就是一组测试数据
4. 参数化,在测试方法上方使用装饰器@parameterized.expand(测试数据)
5. 运行(直接 TestCase 或者使用suite运行)
from tools import add
import unittest
from parameterized import parameterized
data = [(1,1,8),(1,2,3),(2,3,5),(4,5,9)]
class TestAdd(unittest.TestCase):
@parameterized.expand(data)
def test_add(self,a,b,expect):
print(f'a:{a},b:{b},expect:{expect}')
self.assertEqual(expect,add(a,b))
if __name__ == '__main__':
unittest.main()
tools.py
def add(a,b):
return a+b
练习
将测试数据定义为 json文件,读取json文件,完成参数化
1)json文件
[
[1,2,3],
[2,3,5],
[4,5,9],
[3,7,15]
]
2. 读取json的方法
read_json.py
import json
def build_add_data():
with open("test.json") as f:
data = json.load(f) #转换为python对象
return data
3. tools.py
def add(a,b):
return a+b
4. test_add.py
from parameterized import parameterized
from read_json import build_add_data
import unittest
from tools import add
class TestAdd(unittest.TestCase):
@parameterized.expand(build_add_data())
def test_add(self,a,b,c):
self.assertEqual(c,add(a,b))
if __name__ == '__main__':
unittest.main()
如果json文件是这种格式,比如:
[
{
"a": 1,
"b": 2,
"expect": 3
},
{
"a": 2,
"b": 2,
"expect": 3
},
{
"a": 1,
"b": 2,
"expect": 5
}
]
可以用下面的方法来实现
def build_add_data1():
with open("test1.json") as f:
data_list = json.load(f) #转换成Python对象
print(data_list)
new_list = []
for data in data_list: # data是字典
new_list.append(tuple(data.values()))
return new_list
8. 测试报告
使用第三方的报告模板,生成 报告,HTMLTestReport,本质是TestRunner
- 导包unittest\HTMLTestReport
- 组装用例(套件,loader)
- 使用HTMLTestReport 中的runner 执行套件
- 查看报告
import unittest
from htmltestreport import HTMLTestReport
from sample.test_add import TestAdd
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))
runner = HTMLTestReport("test.html",'加法测试报告','菲菲测试')
runner.run(suite)