Python接口自动化-UnitTest
官方文档:https://docs.python.org/zh-cn/3/library/unittest.html?highlight=assertequal
unittest是Python单元测试框架,类似于JUnit框架。
一、UnitTest概念
- Testcase(测试用例)
一个TestCase的实例就是一个测试用例。
是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。
元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
- Test suite(多个测试用例集合)
多个测试用例集合在一起,就是TestSuite
TestSuite也可以嵌套TestSuite
- Test runner(执行测试用例)
是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法
- Test fixture(测试用例环境的搭建和销毁)
对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。
比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。
关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大。
- TestLoader(加载TestCase到TestSuite中)
是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例
二、UnitTest用法
-
用import unittest导入unittest模块
-
定义一个继承自unittest.TestCase的测试用例类,如class xxx(unittest.TestCase):
-
定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。
-
定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。
每个方法的方法名要求以 test 打头,没有额外的参数
-
一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
-
调用unittest.main()启动测试
-
如果测试未通过,则会显示e,并给出具体的错误(此处为程序问题导致)。如果测试失败则显示为f,测试通过为.,如有多个testcase,则结果依次显示。
不加Test suite则执行顺序按照方法名字母顺序执行,不是从上到下执行
三、UnitTest断言
- 布尔断言
无法复制加载中的内容
- 比较断言
| Method | Explain |
|---|---|
| assertAlmostEqual (first, second, places = 7, msg = None, delta = None) | 验证first约等于second。 palces: 指定精确到小数点后多少位,默认为7 |
| assertNotAlmostEqual (first, second, places, msg, delta) | 验证first不约等于second。 palces: 指定精确到小数点后多少位,默认为7 |
| assertGreater (first, second, msg = None) | 验证first > second,否则fail |
| assertGreaterEqual (first, second, msg = None) | 验证first ≥ second,否则fail |
| assertLess (first, second, msg = None) | 验证first < second,否则fail |
| assertLessEqual (first, second, msg = None) | 验证first ≤ second,否则fail |
| assertRegexpMatches (text, regexp, msg = None) | 验证正则表达式regexp搜索匹配的文本text。 regexp:通常使用re.search() |
| assertNotRegexpMatches (text, regexp, msg = None) | 验证正则表达式regexp搜索不匹配的文本text。 regexp:通常使用re.search() |
- 复杂断言

四、UnitTest装饰器
# 无条件跳过装饰的测试,并说明跳过测试的原因
@unittest.skip(reason): skip(reason)
# 条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason): skipIf(condition,reason)
# 条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)
# 测试标记为失败
@unittest.expectedFailure(): expectedFailure()
五、UnitTest代码实例
定义加减乘除函数
'''
@time:
@target:加减乘除函数
@author:
'''
def add(a, b):
return a + b
def minus(a, b):
return a - b
def multi(a, b):
return a * b
def divide(a, b):
return a /
unittest创建测试用例
'''
@time:
@target:unittest测试用例
@author:
'''
import unittest
from mathfunc import *
# unittest.TestCase:TestCase类,所有测试用例类继承的基本类
class TestMathFunc(unittest.TestCase):
'''
setUp()方法用于测试用例执行前的初始化工作。
如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。
如测试用例需要登录web,可以先实例化浏览器
'''
def setUp(self):
print("do something befor test.prepare environment")
'''
tearDown()方法用于测试用例执行之后的善后工作。
如关闭数据库连接。关闭浏览器
'''
# 每条测试用例执行之后操作
def tearDown(self):
print("do something after test.Clean up")
# 测试用例的方法名要求以test打头
def test_zdd(self):
# 断言
self.assertEqual(3, add(1, 2))
self.assertNotEqual(3, add(2, 2))
print("1111111111")
# 装饰器:跳过该条测试用例
@unittest.skip("i don't want to run this case")
def test_minus(self):
self.assertEqual(1, minus(3, 2))
print("22222222222")
def test_dulti(self):
self.assertEqual(6, multi(2, 3))
print("33333333333")
def test_aivide(self):
a = divide(6, 4)
self.assertEqual(2, a)
print(a)
b = divide(5, 2)
self.assertEqual(2.5, b)
print(b)
print("44444444444444")
if __name__ == '__main__':
'''
unittest.main():使用TA可以方便的将一个单元测试模块变为可直接运行的测试脚本,
main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,
并自动执行他们。执行方法的默认顺序是:
根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。
所以以A开头的测试用例方法会优先执行,以a开头会后执行
'''
unittes
unittest执行测试用例
'''
@time:2021年6月25日10:07:24
@target:unittest执行测试用例顺序
@author:
'''
# -*- coding: utf-8 -*-
import unittest
import os
from test_mathfunc import *
if __name__ == '__main__':
'''
法1:通过testsuit来执行测试用例
'''
# 实例化测试套件
suite = unittest.TestSuite()
# 添加TestMathFunc下的测试用例到测试套件中(一个一个加)
suite.addTest(TestMathFunc('test_zdd'))
suite.addTest(TestMathFunc('test_aivide'))
# 实例化TestRunner
runner1 = unittest.TextTestRunner()
# 执行测试套件中的用例
runner1.run(suite)
#使用这种方法可以对测试用例排序(一次性加多个)
tests = [TestMathFunc("test_aivide"), TestMathFunc("test_dulti")]
suite.addTests(tests)
'''
法2:通过discover方式加载某路径下的所有测试用例
'''
# 获取当前工作目录路径
testdir = os.path.dirname(__file__)
print(testdir)
# 加载目录文件下test_mathfunc.py下所有test用例
discover = unittest.defaultTestLoader.discover(testdir,pattern='test_mathfunc.py')
print(discover)
# 实例化TextTestRunner
runner2 = unittest.TextTestRunner()
runner2.run(discover)
'''
法3:通过testLoader方式,加载某个测试类下所有用例
'''
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestMathFunc)
suit = unittest.TestSuite([suite1])
runner3 = unittest.TextTestRunner()
runner3.run

浙公网安备 33010602011771号