Python-UnitTest框架
目标:
1.掌握UnitTest框架的基本使用方法
2.掌握断言的使用方法
3.掌握如何实现参数化
4.掌握测试报告的生成
文章目录
- (一)UnitTest框架
- 一、概念:
- 二、为什么要使用 UnitTest 框架?
- 三、UnitTest 核心要素(unittest的组成)
- (二)TestCase测试用例的书写
- (三)TestSuite 和 TestRunner 的书写
- (四)TestLoader 和 Fixture 的使用
- 一、TestLoader 和 Fixture
- 1. TestLoader(测试加载)
- 2. Fixture(测试夹具)
- 方法级别
- 类级别
- 模块级别
- 二、断言
- 三、参数化
- 四、测试报告
(一)UnitTest框架
一、概念:
UnitTest 是 Python 自带的一个单元测试框架,用它来做单元测试。
自带的框架:只要安装了Python,就可以使用。
第三方框架:需要先安装后使用(pytest)
单元测试框架:主要用来做单元测试,一般单元测试是开发做的。
对于测试来说,unittest 框架的作用是自动化脚本(用例代码)执行框架
(使用unittest框架来管理运行多个测试用例)
二、为什么要使用 UnitTest 框架?
① 能够组织多个用例去执行
② 提供丰富的断言方法
③ 能够生成测试报告
三、UnitTest 核心要素(unittest的组成)
- TestCase(最核心的模块)
TestCase(测试用例)
主要作用:每个TestCase都是一个代码文件,在这个代码文件中,来书写真正的用例代码
- TestSuite
TestSuite(测试套件)
管理组装(打包)多个 TestCase(测试用例)
- TestRunner
TestRunner(测试执行,测试运行)
执行TestSuite
- TestdLoader
TestLoader(测试加载)
功能是对TestSuite功能的补充,管理组装(打包)多个TestCase
- Fixture
Fixture(测试夹具)
书写在TestCase代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容
(二)TestCase测试用例的书写
步骤
1.导入包(unittest)
2.自定义测试类
3.在测试类中书写测试方法
4.执行用例
# 1.导入包
import unittest# 2.自定义测试类,需要继承unittest模块中的TestCase类即可
class TestDemo(unittest.TestCase):# 3.书写测试方法,即用例代码,目前没有真正的用例代码,使用print代替# 书写要求:测试方法必须以test_开头(本质是以test开头)def test_method1(self):print('测试方法1')def test_method2(self):print('测试方法2')# 4.执行用例(方法)
# 4.1 将光标放在类名的后边运行,会执行类中所有的测试方法
# 4.2 将光标放在方法名的后边运行,只执行当前的方法
4.1的运行结果:

4.2的运行结果:


(三)TestSuite 和 TestRunner 的书写
步骤:
1.导入包(unittest)
2.实例化(创建对象)套件对象
3.使用套件对象添加用例方法
4.实例化运行对象
5.使用运行对象去执行套件对象
用例文件:




再新建一个stu02_suite_runner.py文件:
# 1.导入包
import unittest
from stu02_testcase1 import TestDemo1
from stu02_testcase2 import TestDemo2
from stu02_testcase3 import TestDemo3# 2.实例化(创建对象)套件对象
suite = unittest.TestSuite()# 3.使用套件对象添加用例方法
# 套件对象.addTest(测试类名('方法名'))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
suite.addTest(TestDemo3('test_method1'))
suite.addTest(TestDemo3('test_method2'))# 4.实例化运行对象
runner = unittest.TextTestRunner()# 5.使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)
▲ 运行结果:

点:用例通过
F:用例不通过
E:error,用例代码有问题
(四)TestLoader 和 Fixture 的使用
一、TestLoader 和 Fixture
1. TestLoader(测试加载)
作用和 TestSuite 的作用是一样的,对 TestSuite 功能的补充,
用来组装测试用例。
使用步骤:
1.导入包
2.实例化测试加载对象并添加用例 ——>得到的是 suite 对象
3.实例化 运行对象
4.运行对象执行套件对象

# 1.导入包
import unittest# 2.实例化加载对象并添加用例
# unnittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符
suite = unittest.TestLoader().discover('./case','stu01_*.py')# 3.实例化运行对象
runner = unittest.TextTestRunner()# 4.执行
runner.run(suite)
可以将3,4步变为一步
# 1.导入包
import unittest# 2.实例化加载对象并添加用例
# unnittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符
suite = unittest.TestLoader().discover('./case','stu01_*.py')# 3.实例化运行对象
inittest.TextTestRunner().run(suite)
2. Fixture(测试夹具)
Fixture(测试夹具)是一种代码结构。
在某些特定的情况下,会自动执行。
方法级别
在每个测试方法(用例代码)执行前后都会自动调用的结构。
# 方法执行之前
def setup(self):每个测试方法执行之前都会执行pass# 方法执行之后
def teardown(self):每个测试方法执行之后都会执行pass
类级别
在每个测试类中所有方法执行前后,都会自动调用的结构(在整个类中,执行之前、执行之后各一次)
# 类级别的Fixture方法,是一个 类方法
# 类中所有方法之前
@classmethod
def setupClass(cls):pass# 类中所有方法之后
@classmethod
def teardownClass(cls):pass
模块级别
模块:代码文件
在每个代码文件执行前后执行的代码结构
# 模块级别的需要写在类的外边直接定义函数即可
# 代码文件之前
def setupModule():pass# 代码文件之后
def teardownModule():pass
方法级别和类级别的 前后的方法,不需要同时出现,根据用例代码的需要自行选择使用。
二、断言
断言:让程序代替人工判断测试程序执行结果是否符合预期结果的过程。
常用的 UnitTest 断言方法:
| 序号 | 断言方法 | 断言描述 |
|---|---|---|
| 1 | assertTrue(expr,msg=None) | 验证expr是true,如果为false,则fail |
| 2 | assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
| 3 | assertEqual(expected,actual,msg=None) | 验证expected==actual,不等则fail |
| 4 | assertNotEqual(first,second,msg=None) | 验证first!=second,相等则fail |
| 5 | assertIsNone(obj,msg=None) | 验证obj是None,不是则fail |
| 6 | assertIsNotNone(obj,msg=None) | 验证obj不是None,是则fail |
| 7 | assertIn(member,container,msg=None) | 验证是否member in container |
| 8 | assertNotIn(member,container,msg=None) | 验证是否member not in container |
Eg:
import unittestclass TestAssert(unittest.TestCase):def test_equal(self):self.assertEqual(1 + 2, 3) # 相等,断言通过def test_in(self):self.assertIn("a", ["a", "b", "c"]) # "a"在列表中,通过def test_raise(self):# 断言除以0会抛出 ZeroDivisionErrorwith self.assertRaises(ZeroDivisionError):1 / 0
三、参数化
在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量。
1.测试数据一般放在json文件中
2.使用代码读取json文件,提取我们想要的数据——>[(),(0]或[[],[]]
安装插件:pip install parameterized
代码:
1.导入包 unittest/ pa
2.定义测试类
3.书写测试方法(用到的测试数据使用变量代替)
4.组织测试数据并传参
四、测试报告
pip install html-testRunner
runner = HtmlTestRunner.HTMLTestRunner(output='reports', # 报告输出目录report_title='测试报告', # 报告标题descriptions='XX测试结果' # 报告描述)
