要重视测试代码编写地位,编写测试代码的作用和编写逻辑代码一样重要,如果逻辑代码不能运行了就等于工作白费了。
需要了解测试的基本概念,测试的验证函数(skip装饰器等一些函数),测试实例,测试运行方式
前言:
0. 编写测试代码的作用
(1)能够发现接口之间的依赖性,可以快速定位到因为修改某个接口(字段名/字段值)其他出现问题的接口。
比如如果需要修改某个接口的字段名,如果其他接口也依赖这个字段名可能导致某个接口出现问题,人工一个个发现这些异常接口都比较困难,修改异常接口也有可能导致更多接口失效,因此编写测试用例可以在修改某个接口后可以快速定位修改依赖的接口。
(2)增强接口的健壮性。
手工的编写参数测试某个接口即费时费力,存在考虑不全的情况,编写测试用例可能能够发现人为考虑不到的一些接口异常。
(3)实时检测异常。
每个接口可能用到不同的数据库等情况,不能保证项目中每个接口都是正常可用的,可能未知情况导致某一个接口不能用,编写测试定时检测,能够第一时间发现定位到这些异常。
1. 单元测试的几个重要概念
(1)Test Case
一个Test Case实例是一个测试用例,完整的测试流程包括测试前准备环境的搭建(setUp)、实现测试过程的代码(run)、以及测试后环境的还原(tearDown)。
(2)Test Suite
Test Suite用来组装单个测试用例,可以将多个测试用例集合再一起来执行,通过addTest加载TestCase到TestSuit实例中。
(3)Test Runner
执行测试,执行结果。unittest单元测试框架中,通过TextTestRunner类提供的run()方法来执行test suit和test case,test runner可以使用图形界面,文本界面,或返回一个特殊的值等方式来表示测试执行的结果。
(4)Test fixture
对于一个测试用例环境的搭建和销毁,就是一个fixtrue,通过覆盖testcase的setup()和teardown()方法来实现。
setup():比如建立数据库连接进行初始化
teardown():比如清除数据库产生的数据,关闭连接。该方法很重要,要为下一个test case留下一个干净的环境
2. unittest常用断言函数:
方法 | 检查 |
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) |
3.测试用例实例
# python测试用例例子
# coding:utf-8
import unittest
class Test(unittest.TestCase):
def test01(self):
'''
判断 a = b
'''
a = '111'
b = '111'
self.assertEqual(a,b)
if __name__ == '__main__':
unittest.main()
4. 测试用例的运行方式
1. pycharm右键运行,运行环境是项目文件所在的环境
2. pycharm光标放在某个测试功能下,右键运行会只运行当前的测试用例
3. 终端运行:python -m unittest 测试代码.py 运行环境是当前终端目录环境,不加m参数的话,运行环境是文件所有目录