一、简介
1、unittest的作用
unittest是Python内置的单元测试框架,主要用于单元测试,具备编写用例、组织用例、执行用例、输出报告等作用。
2、单元测试框架的优点
单元测试是通过一段代码去验证另一段代码,所以不用单元测试框架也能编写单元测试,但使用框架会更加规范与便捷。单元测试框架的优点:1、提供用例组织与执行;2、提供丰富的断言方法;3、提供丰富的日志。
3、单元测试经常用到的五个概念
- test case:自动化测试用例,一个TestCase的实例就是一个测试用例;
- test suite:测试套件,是多个测试用例的集合;
- testLoader:加载器,用于加载TestCase到TestSuite中。其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例;
- test runner:执行测试,执行测试用例,并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息;
- test fixture:测试夹具,一个测试用例的初始化准备及环境还原,主要包含setUp() 和 setDown()方法;
4、unittest的工作原理
首先,编写TestCase完成,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,最后将运行的结果保存在TextTestResult中
二、Test Case的作用与使用
1、什么是测试用例?
一个TestCase的实例就是一个测试用例,它是一个完整的测试流程。包括测试前准备环境的搭建(SetUP)、实现测试过程的代码(run),以及测试后环境的还原(tearDown)。单元测试(Unittest)的本质也就在这里,一个测试用例就是一个完整的测试单元,通过运行这个测试单元,可以对某一个功能进行验证。
2、手工测试用例与自动化测试用例的区别
手工测试用例:
- 能通过人为的逻辑判断校验当前步骤的功能实现是否正确。能较好的处理异常场景。
- 执行测试用例具备一定的跳跃能力。
- 人工测试可以步步跟踪分析,能够细致的定位问题。
- 主要用来发现产品缺陷。
自动化测试用例:
- 所有的判断校验都需要编写脚本来实现。
- 测试用例步骤之间需要关联关系。
- 主要用来保证产品主体功能正确完整和让测试人员从繁琐重复的工作中解脱出来。
- 目前自动化测试阶段定位在冒烟测试和回归测试。
3、testcase实例
编写testcase前:
- 需先导入unittest包;
- 实例化一个类;
- 将实例化的类继承于unittest.TestCase;例:class example1(unittest.TestCase)
代码:
# 使用unittest前,需导入unittest库
import unittest
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def setUp(self):
print('前置函数,每个用例运行前会自动执行一次该函数')
def tearDown(self):
print('后置函数,每个用例运行后会自动执行一次该函数')
# 创建测试用例test_a01,用例需以test开头
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
# ---------------------------test runner部分-------------------
if __name__ == '__main__':
# 执行当前文件的测试用例
unittest.main()
执行结果:
前置函数,每个用例运行前会自动执行一次该函数
测试用例1
后置函数,每个用例运行后会自动执行一次该函数
前置函数,每个用例运行前会自动执行一次该函数
测试用例2
后置函数,每个用例运行后会自动执行一次该函数
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
注:创建用例需以test开头,实例类下面一个以test开头的函数就是一条用例。setUp()是测试用例执行前的环境准备,tearDown()是测试用例执行结束后的环境恢复,每个测试用例都会执行一次setUp()和tearDown()。
4、断言
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。测试中,断言一般用于将实际结果与预期结果对比,结果一致返回true,结果不一致返回false。
代码:
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
a,b=1,1 # 设置变量a=1,b=1
self.assertEqual(a,b,'错误提示,a不等于b') # 设置断言a等于b,不相等报错并输出提示文字
print('测试用例1')
执行结果:
测试用例1
Ran 1 test in 0.001s
OK
注:断言方法前要加上self,如:self.assertEqual(a,b)
常用断言方法
方法 | 结果 |
---|---|
assertEqual(a, b) | a == b |
assertNotEqual(a, b) | a != b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIs(a, b) | a is b |
assertIsNot(a, b) | a is not b |
assertIsNone(x) | x is None |
assertIsNotNone(x) | x is not None |
assertIn(a, b) | a in b |
assertNotIn(a, b) | a not in b |
assertIsInstance(a, b) | isinstance(a, b) |
assertNotIsInstance(a, b) | not isinstance(a, b) |
5、跳过用例
在自动化测试中,经常会遇到部分用例无需执行的情况。当用例特别多时,一条一条注释用例或反复添加到testsuit中比较麻烦,这时可以使用unittest中的skip装饰器。
skip装饰器主要有3种:
- unittest.skip(reason):无条件跳过装饰的用例,并返回跳过的原因reason。
- unittest.skipIf(condition,reason):condition条件为真时,跳过装饰的用例,并返回跳过的原因reason。
- unittest.skipUnless(condition,reason):condition条件为假时,跳过装饰的用例,并返回跳过的原因reason。
注:condition表示满足condition条件下则跳过该用例,reason表示跳过的原因。
代码:
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
print('测试用例1')
@unittest.skipIf(1,'当1为true时,跳过test_a02用例')
def test_a02(self):
print('测试用例2')
执行结果:
测试用例1
Ran 2 tests in 0.001s
OK (skipped=1)
Skipped: 当1为true时,跳过test_a02用例
三、Test Suit的使用
1、testsuit的作用
- 解决用例执行顺序的问题,让用例按配置的顺序执行
- 解决用例在多个py文件中分散的问题,将所需用例收集、汇总
2、testsuit实例
在自动化测试中,一般会将测试用例(test case)和执行用例(test runner)的代码分开,写在两个不同的py文件中。这里将测试用例代码写在fff.py文件,将执行测试代码写在run_all.py文件
测试用例(fff.py文件):
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01