简介、基本概念、基本示例
1、简介
unittest是Python自带的一个单元测试框架,unittest又被称为PyUnit,是由Java的JUnit衍生而来,基本结构是类似的。对于单元测试,需要设置预先条件,对比预期结果和实际结果。
由于unittest是Python自带的标准模块,所以不需要单独再去安装。引入包import unittest即可使用。
2、基本概念
1、unittest核心的四个概念:
test fixture:一般用于准备及清理工作。
test case:通常是使用assert方法检查动作和输入的响应,一般是基于TestCase类扩充。
test suite:多个测试的集合。
test runner:测试执行。
2、unittest.TestCase:TestCase类,所有测试用例类继承的基本类。
例如:
代码语言:javascript复制class TestDemo(unittest.TestCase):
3、setUpClass():必须使用@classmethod装饰器,所有test运行前执行一次。
例如:
代码语言:javascript复制@classmethod
def setUpClass(cls):
print('setUpClass')
4、tearDownClass():必须使用@classmethod装饰器,所有test运行完后执行一次。
例如:
代码语言:javascript复制@classmethod
def tearDownClass(cls):
print('tearDownClass')
5、setup():每个测试方法运行前执行。
例如:
代码语言:javascript复制def setUp(self):
print('setUp')
6、teardown():每个测试方法运行完后执行。
例如:
代码语言:javascript复制def tearDown(self):
print('tearDown')
7、每个测试方法均以test开头,否则是不被unittest识别的。
例如:
代码语言:javascript复制def test_case1(self):
print('test_case1')
8、unittest.main():将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
9、unittest.TestSuite():创建测试套件。addTest()/addTests()方法是将测试用例添加到测试套件中。
例如:将test_Demo1模块下的TestDemo1类下的test_case1测试用例添加到测试套件中。
代码语言:javascript复制suite = unittest.TestSuite()
suite.addTest(test_Demo1.TestDemo1('test_case1'))
10、unittest.TestLoader():根据不同的条件加载测试用例,其中有几个方法:
代码语言:javascript复制unittest.TestLoader().loadTestsFromName()
unittest.TestLoader().loadTestsFromNames()
unittest.TestLoader().loadTestsFromTestCase()
unittest.TestLoader().loadTestsFromModule()
unittest.TestLoader().discover()
例如:将test_case包下的test_Demo1模块下的TestDemo1类下的test_case1测试用例添加到测试套件中。
代码语言:javascript复制suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromName('test_case.test_Demo1.TestDemo1.test_case1'))
11、unittest.defaultTestLoader():通过该类下面的discover()方法可自动根据测试目录test_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中。
例如:
代码语言:javascript复制discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
12、unittest.TextTextRunner():通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
例如:
代码语言:javascript复制suite = unittest.TestSuite()
suite.addTest(TestDemo('test_case1'))
runner = unittest.TextTestRunner()
runner.run(suite)
3、基本示例
1、创建test_Demo.py文件。
创建TestDemo类,并继承unittest.TestCase;创建setUpClass、tearDownClass、setUp、tearDown;之后创建多个以test开头的测试方法,每个这样的方法在load的时候便会生成一个TestCase实例,如TestDemo类中有3个test_xxx方法,最后在load到suite中便有3个测试用例。
脚本代码:
代码语言:javascript复制#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 导入unittest模块
import unittest
"""
基本示例
"""
# 定义测试类,父类为unittest.TestCase
class TestDemo(unittest.TestCase):
# 必须使用@classmethod装饰器,所有test运行前执行一次
@classmethod
def setUpClass(cls):
print('setUpClass')
# 必须使用@classmethod装饰器,所有test运行完后执行一次
@classmethod
def tearDownClass(cls):
print('tearDownClass')
# 每个测试方法运行前执行
def setUp(self):
print('setUp')
# 每个测试方法运行完后执行
def tearDown(self):
print('tearDown')
# 所有的测试方法都要以test为开头
def test_case1(self):
print('test_case1')
def test_case2(self):
print('test_case2')
def test_case3(self):
print('test_case3')
if __name__ == '__main__':
unittest.main()
2、执行test_Demo.py文件,运行结果:
setUpClass()最先执行;
tearDownClass()最后执行;
setup()每个测试方法运行前执行;
teardown()每个测试方法运行完后执行;
3个测试方法(test_case1、test_case2、test_case3)。
最后打印出的3个点为3个测试方法执行结果标识:
成功是 .
失败是 F
出错是 E
跳过是 S
3、在unittest.main()中加verbosity参数可以控制输出报告的详细程度,默认是1。
verbosity=0 是简单报告;
verbosity=1 是一般报告;
verbosity=2 是详细报告。
将test_Demo.py文件里的unittest.main()修改为unittest.main(verbosity=2),再次执行脚本。
运行结果:执行后输出的详细报告信息。