是Python自带的单元测试框架,用来组织执行测试用例。
1、TestCase: 写测试用例
2、TestSuite: 收集测试用例
3、TestRunner: 执行测试用例
4、TestFixture: 测试脚手架,前置条件,后置清理
1、使用TestCase按照规则写测试用例,每一个函数为一个测试用例
2、TestSuite:创建一个测试套件:收集测试用例到测试套件
3、TestRunner:统一执行测试套件里面的用例
4、生成测试报告
1、导入模块unittest
2、创建一个测试类,继承unittest.TestCase
测试用例必须写在测试类里面
3、测试用例以Test开头
4、执行入口:unittest.main()
5、测试用例包含哪些东西
(1)前置条件:[token、session]
(2)测试步骤:ddt+接口请求+提取全局变量
(3)测试断言:利用unittest框架自带的断言
(4)日志收集:还原整个测试过程
(5)后置清理:是否要清理掉测试数据,删除测试,关闭各种文件的连接,关闭数据库连接。
6、测试用例的执行顺序
(1)按照测试用例名称的Ascii码大小执行
chr():Ascii ---- 字符
ord():字符----Ascii
(2)执行顺序
类级别前置---函数级别前置--测试用例--函数级别后置---类级别后置
五、代码实例
import unittest
import time
class TestDemo(unittest.TestCase):
def setUp(self) -> None:
print("setUp", "每一个测试用例执行之前会自动执行")
time.sleep(2)
def tearDown(self) -> None:
print("tearDown", "每一个测试用例执行之后都会执行")
time.sleep(2)
@classmethod
def setUpClass(cls) -> None:
print("setUpClass", "测试类执行开始的时候执行,只执行一次")
time.sleep(2)
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass", "测试类执行完成后执行,只执行一次")
time.sleep(2)
def test_01(self):
print("test01")
time.sleep(2)
def test_03(self):
print("test03")
time.sleep(2)
def test_02(self):
print("test02")
time.sleep(2)
# 错误的用例,没有以test开头,框架不识别
# def demo01(self):
# print("demo01")
if __name__ == '__main__':
unittest.main()
执行结果:
Testing started at 5:24 下午 ...
Launching unittests with arguments python -m unittest /Users/wangchuangyan/Desktop/py42/Summary/TestUnitest.py in /Users/wangchuangyan/Desktop/py42/Summary
setUpClass 测试类执行开始的时候执行,只执行一次
tearDownClass 测试类执行完成后执行,只执行一次
Ran 3 tests in 22.052s
OK
Process finished with exit code 0
setUp 每一个测试用例执行之前会自动执行
test01
tearDown 每一个测试用例执行之后都会执行
setUp 每一个测试用例执行之前会自动执行
test02
tearDown 每一个测试用例执行之后都会执行
setUp 每一个测试用例执行之前会自动执行
test03
tearDown 每一个测试用例执行之后都会执行
六、测试用例收集与执行
1、另起一个页面对用例收集与执行
import unittest
from Summary.TestUnitest import TestDemo
# 创建测试套件
suite = unittest.TestSuite()
# 添加测试用例到测试套件, 添加一条
suite.addTest(TestDemo('test_01'))
# 运行测试用例
runner = unittest.TextTestRunner()
runner.run(suite)
运行结果:
setUpClass 测试类执行开始的时候执行,只执行一次
setUp 每一个测试用例执行之前会自动执行
test01
tearDown 每一个测试用例执行之后都会执行
tearDownClass 测试类执行完成后执行,只执行一次
2、用例收集的几种方式
测试用例为维度:
1、收集一条用例
suite.addTest(TestDemo('test_01')) 收集一条
2、收集多条
case_list= [TestDemo("test_01"),TestDemo("test_03")]
suite.addTests(tests=case_list)
测试类为维度:
3、添加整个测试类
suite.addTest(unittest.makeSuite(TestDemo))
4、 使用unittest.TestLoader
suite = unittest.TestLoader().loadTestsFromTestCase(TestDemo)
测试文件为维度:
5、指定收集某个目录下的某个测试用例文件的测试用例 (以test开头的py文件) 【常用的】
dir_path = os.path.dirname(__file__)
print(dir_path)
suite = unittest.defaultTestLoader.discover(start_dir=dir_path)
3、运行测试用例
runner = unittest.TextTestRunner()
runner.run(suite)
1、TextTestRunner()自带的测试报告,不好看,无法识别
2、HTMLTestRunner:不好看
3、BeautifulReport:第三方库,还可以,推荐使用 pip install BeautifulReport
4、unittestreport: 第三方库,musen
1、使用BeautifulReport 生成测试报告
from Summary import test_case
from Summary.test_case import TestDemo
from BeautifulReport import BeautifulReport
# 创建测试套件
suite = unittest.TestSuite()
dir_path = os.path.dirname(__file__)
suite = unittest.defaultTestLoader.discover(start_dir=dir_path)
report = BeautifulReport(suites=suite)
report.report(description="测试报告", filename="test_report.html") # html报告
会在与case的同一级目录下,生成一个test_report.html的报告,打开
2、使用unittestreport生成测试报告代码示例
from Summary import test_case
from Summary.test_case import TestDemo
from unittestreport import TestRunner
# 创建测试套件
suite = unittest.TestSuite()
# unittestreport 生成测试报告
dir_path = os.path.dirname(__file__)
suite = unittest.defaultTestLoader.discover(start_dir=dir_path)
runner = TestRunner(suite=suite,
filename="musengReport.html",
title="测试报告",
tester="yan",
desc="测试项目生成的报告",
templates=1)
runner.run()