UnitTest框架的基本使用
1、概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试
2、UnitTest框架的优势:
- 能够组织多个用例去执行
- 提供丰富的断言方法
- 能够生成测试报告
3、核心要素:
- TestCase(测试用例)
- TestSuite(测试套件)
- TestRunner(以文本的形式运行测试用例)
- TestLoader(批量执行测试用例-搜索指定文件夹内指定字母开头的模块)
- Fixture(固定装置:两个固定的函数,一个初始化时使用,一个结束时使用)
3.1 TestCase
1、说明:TestCase就是测试用例
2、案例:
1. 导包:import unittest
2. 定义测试类:新建测试类必须继承unittest.TestCase
3. 定义测试方法:测试方法名称命名必须以test开头(注意)
import unittest
class Test(unittest.TestCase):
def test01(self):
print("测试用例1")
def test02(self):
print("测试用例2")
运行结果:
注意:运行测试类所有的测试方法,光标定位到类当前行右键运行。
运行单个测试方法:光标放到测试方法当前行。
3.2 TestSuite
1、说明:多条测试用例集合在一起,就是一个TestSuite(测试套件)
2、使用:
1. 实例化: suite = unittest.TestSuite()
(suite:为TestSuite实例化的名称)
2. 添加用例:suite.addTest(ClassName("MethodName"))
(ClassName:为类名;MethodName:为方法名)
3. 添加扩展:suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName内test开头的方法并添加到测试套件中)
提示:TestSuite需要配合TestRunner才能被执行
3.3 TextTestRunner
1、说明:TextTestRunner是用来执行测试用例和测试套件的
2、使用:
1. 实例化: runner = unittest.TextTestRunner()
2. 执行: runner.run(suite) # suite:为测试套件名称
3、案例:(左边是主程序文件,右边是TestCase.py文件)
运行结果:
3.4 TestLoader
1、说明:用来加载TestCase到TestSuite中,即加载满足条件的测试用例,并把测试用例封装成测试套件;使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件。
2、使用:
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件
test_dir: 为指定的测试用例的目录
pattern:为查找的.py文件的格式,默认为'test*.py'
也可以使用unittest.defaultTestLoader 代替 unittest.TestLoader()
运行:
runner = unittest.TextTestRunner()
runner.run(suite)
3、TestLoader与TestSuite区别
(1)TestSuite需要手动添加测试用例(可以添加测试类,也可以添加测试类中某个测试方法)
(2)TestLoader搜索指定目录下指定开头.py文件,并添加测试类中的所有的测试方法,不能指定添加某个测试方法
Fixture
1、说明:Fixture是一个概述,对一个测试用例环境的初始化和销毁就是一个Fixture
2、控制级别:
- 方法级别
- 类级别
- 模块级别(了解)
3、 使用:
1、方法级别:
# 初始化(前置处理)
def setUp(self): --> 首先自动执行
# 销毁(后置处理)
def tearDown(self): --> 最后自动执行
# 运行于测试方法的始末,即:运行一次测试方法就会运行一次setUp和tearDown
2、类级别:
# 初始化(前置处理)
@classmethod
def setUpClass(cls): --> 首先自动执行
# 销毁(后置处理):
@classmethod
def tearDownClass(cls): --> 最后自动执行
# 运行于测试类的始末,即:每个测试类只会运行一次setUpClass和tearDownClass
3、模块级别(了解)
# 初始化(前置处理)
def setUpModule(): --> 首先自动执行
# 销毁(后置处理)
def tearDownModule(): --> 最后自动执行
# 运行于整个模块的始末,即:整个模块只会运行一次setUpModule和tearDownModule
4、使用场景:
(1)初始化
- 获取浏览器实例化对象
- 最大化浏览器
- 隐式等待
(2)结束
- 关闭浏览器驱动对象
断言
1、概念:让程序代替人为判断测试程序执行结果是否符合预期结果的过程
2、常用的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
|
3、使用方法:
import unittest
def add(x, y):
return x + y
class Assert(unittest.TestCase):
def test01(self):
num = add(1, 2)
self.assertEqual(3, num) # 判断3是否和num相等
def test02(self):
num = add(1, 2)
flag = num == 3
self.assertTrue(flag) # 判断flag是否等于True
参数化
1、概念:通过参数的方式来传递数据,从而实现数据和脚本分离并且可以实现用例的重复执行。
unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展插件parameterized来实现。
2、数据格式:
- 单个参数:类型为列表
- 多个参数:类型为列表嵌套元祖
- 在测试函数中的参数设置变量引用参数值,注意:变量的数量必须和数据值的个数相同
3、使用方式:
- 导包:from parameterized import parameterized
- 使用@parameterized.expand装饰器可以为测试函数的参数进行参数化
# 方式一
@parameterized.expand([(1, 1, 2), (1, 0, 1), (0, 0, 0)])
def test_add(self, x, y, expect):
pass
# 方式二
data = [(1, 1, 2), (1, 0, 1), (0, 0, 0)]
@parameterized.expand(data)
def test_add(self, x, y, expect):
pass
# 方式三
def build_data():
return [(1, 1, 2), (1, 0, 1), (0, 0, 0)]
@parameterized.expand(build_data)
def test_add(self, x, y, expect):
pass
跳过
1、介绍:对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行
2、使用方法:
# 直接将测试函数标记成跳过
@unittest.skip(reason)
# 根据条件判断测试函数是否跳过
@unittest.skipIf(condition, reason)
注意:以上两种方法,都可以修饰函数(def)和类(class)
3、案例:
import unittest
version = 35
class TestSkip(unittest.TestCase):
@unittest.skip("代码未完成")
def test_01(self):
print("test_01")
@unittest.skipIf(version <= 30, "版本大于30才会执行")
def test_02(self):
print("test_02")
执行结果:
生成HTML测试报告
1、说明:HTML测试报告就是执行完测试用例后,以HTML(网页)方式将执行结果生成报告
2、作用:
- 测试报告是本次测试结果的体现形式
- 测试报告包含了有关本次测试用例的详情
3、生成方式:
- Export Test Results(UnitTest自带)
- HTML TestRunner(第三方模块)——重要
3.1 Export Test Results
案例:
import unittest
# 定义 测试套件
suite = unittest.defaultTestLoader.discover("./", pattern="test0*.py")
# 自带执行
with open("./report.txt", "w", encoding="utf-8") as f:
unittest.TextTestRunner(stream=f, verbosity=2).run(suite)
注意:strem是文件流、verbosity是执行方式,可选[1,2,3]
执行结果:
3.2 HTML TestRunner
插件获取:https://pan.baidu.com/s/16rGtY_yIQ7sX5lAFolsGSg?pwd=jl89 提取码:jl89
案例:
# 导包
from tools.HTMLTestRunner import HTMLTestRunner
import unittest
# 定义 测试套件
suite = unittest.defaultTestLoader.discover("./", pattern="test0*.py")
# 插件执行
with open('./report.html', "wb") as f:
HTMLTestRunner(stream=f, title='xxx自动化测试报告', description='win10 Chrome').run(suite)
stream:文件流,打开写入报告的名称及写入编码格式(html报告必须是二进制形式)
title:[可选参数],为报告标题,如XXX自动化测试报告
description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本
执行结果: