1、概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试
2、UnitTest框架的优势:
3、核心要素:
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")
运行结果:
注意:运行测试类所有的测试方法,光标定位到类当前行右键运行。
运行单个测试方法:光标放到测试方法当前行。
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才能被执行
1、说明:TextTestRunner是用来执行测试用例和测试套件的
2、使用:
1. 实例化: runner = unittest.TextTestRunner()
2. 执行: runner.run(suite) # suite:为测试套件名称
3、案例:(左边是主程序文件,右边是TestCase.py文件)
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文件,并添加测试类中的所有的测试方法,不能指定添加某个测试方法
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、使用方式:
# 方式一
@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")
执行结果:
1、说明:HTML测试报告就是执行完测试用例后,以HTML(网页)方式将执行结果生成报告
2、作用:
3、生成方式:
案例:
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]
执行结果:
插件获取: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:[可选参数],为报告描述信息;比如操作系统、浏览器等版本
执行结果: