- unittest单元测试框架?
什么是unittest? 是python标准的单元测试框架模块
2.unittest框架4个概念?
- test fixture 测试固件
代表测试前的准备动作
代表测试后的清理动作
如: 创建数据库连接 / 启动服务进程 / 测试环境的清理 / 关闭数据库的连接 - test case 测试用例
一个 test case 就是一个最小的测试单元, 也就是一个完整的测试流程.
针对特定的输入,进行特殊的验证与响应.
通过继承自unittest的基类TestCase,可以创建测试用例. - test suite 测试套件
代表一组测试用例/ 一组测试套件/ 两者共同组成的集合. - test runner 测试运行器
执行设定的测试用例 with 将测试结果提供给用户两部分功能组成.
- 单元测试加载方法?
1> 直接通过unittest.main()方法加载,按照方法名的字符串表示的ASCII吗升序排序.
2> 将所有的单元测试用例添加到测试套件集合中,然后一次性加载所有测试对象.
4.测试用例?
unittest框架通过TestCase类来构建测试用例
所有自定义的类都必须继承TestCase类
TestCase是所有测试用例的基类, 传入一个方法名,将返回一个测试用例对象.
测试用例即可单独执行, 也可以组合成测试用例集,然后批量执行
TestCase子类必须从父类继承的几个特殊的方法, 在测试用例执行是均会被依次执行.
- setUp() 每个测试方法运行前先执行, 测试前的初始化工作.
- tearDown() 每个测试方法运行结束后运行, 测试后的清理工作.
- setUpClass() 所有的测试方法运行前运行, 单元测试前期准备,
必须使用@classmethod装饰器修饰
在setUp()方法之前执行,整个测试只执行一次. - tearDownClass() 所有的测试方法结束之后执行, 单元测试后期清理
必须使用@tearDownClass装饰器修饰
在tearDown()方法之后执行,整个测试只执行一次.
最简单的测试用例只需要覆盖runTest()方法执行自定义的测试代码,这种方法是静态方法.
- 使用框架的规定有哪些?
所有需要被执行的测试方法必须以" test "开头;
....... - 指定python源码的编码格式
在源文件第一行或者第二行定义:
# coding=<encoding name>
# coding=utf-8
# coding:utf-8
# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8
7.测试结果说明:
setUpClass()方法和tearDownClass()方法整个测试类运行过程只执行一次.
setUp()方法和tearDown()方法在每个测试方法执行前执行后均被调用执行.
测试结果输出 点. 表示测试方法被成功执行,
测试结果出现E或F,表示测试方法执行失败或发生异常.
动态方法不再覆盖runTest()方法,而是直接在一个测试类中编写.
8.测试集合
将功能相关的测试用例组合在一起称之为测试用例集
通过TestSuite类来组装所有的测试用例集.
使用测试集合可以同时执行同一个.py文件中的多个用例类.
加载测试集合的步骤:
1>TestLoader(测试用例加载器)根据传入的参数获取相应的测试用例的测试方法
2>然后makeSuite把所有的测试用例组装成test suite集合.
3>最后将test suite集合传给test runner执行.
makeSuite通常由测试框架调用,用于生产test suite对象的实例.
if name=='main':
根据给定的测试类,获取以test开头的测试方法,并返回一个测试套件
testCase1=unittest.TestLoader().loadTestsFromTestCase(TestClassName1)
testCase2=unittest.TestLoader().loadTestsFromTestCase(TestClassName2)
将多个测试类加载到测试套件中
suite=unittest.TestSuite([testCase1,testCase2])
设置verbosity=2,可以打印更详细的执行信息
unittest.TextTestRunner(verbosity=2).run(suite)
(1)TestLoader类: 测试用例加载器,返回一个测试用例集合
(2)loadTestFromTestCase类: 根据给定的测试类, 获取其中所有以test开头的测试方法,返回集合
(3)TestSuite类: 组装测试用例的实例,支持添加和删除用例,最后将传递给test runner进行执行
(4)TextTestRunner类: 测试用例执行类,其中Text表示已文本形式输出测试结果.
更多说明:
- verbosity<1的整数,输出结果中不提示执行成功的用例数.
- verbosity=1的整数,输出结果中仅以点(.)表示执行成功的用例数
- verbosity>1的整数,可以输出每个用例的详细信息
- TestRunner.run()方法会返回一个TestResult实例对象,该实例对象里存储着所有测试用例执行过程中的详细信息. 可以通过dir()方法查看该方法详情
9.测试用例执行顺序
默认是按照所有方法名的字符串的ASCII吗排序后执行的. 通常不符合我们的需求
如果想按照我们自己设定顺序执行,方法如下:
if__name__=='main':
1> 启动单元测试
unittest.main()
2> 获取一个单元测试用例集TestSuite的实例对象suite
suite=unittest.TestSuite()
3> 将测试用例添加到测试容器中
suite.addTest()
例如:
suite=addTest(MyTestClass("test_add"))
suite=addTest(MyTestClass("test_sub"))
suite=addTest(MyTestClass("test_mul"))
suite=addTest(MyTestClass("test_div"))
4>创建TextTestRunner类的实例对象
runner = unittest.TextTestRunner()
runner.run(suite)
5.以上只是单线程执行测试, 不适用与多线程情况.
10.忽略某个测试方法
在想要忽略的方法上面加上注解/装饰器
无条件忽略 @unittest.skip("skipping")
有条件忽略
如果变量a>5, 则忽略该测试方法. a是类里指定的值.
@unittest.skipIf(a>5,"condition is satisfied ")
除非执行测试用例的平台是window平台,否则忽略该测试方法
@unittest.skipUnless(sys.platform.startswith("linux"),"requires Windows")
- 命令行执行测试用例
unittest支持命令行模式运行测试模块,类,甚至单独有效的测试方法
1通过命令直接运行整个模块
命令格式: python -m unittest test_module1 test_modeule2 ...
2.执行测试模块中的某个测试类
命令格式: python -m unittest test_module.TestClass
3.执行测试模块中某个类中的某个测试方法
命令格式: python -m unittest test_module.TestClass.test_method
使用命令执行测试用例前,必须切换到测试脚本存放目录,
命令行中 -v 参数表示输出测试用例执行的详细信息,等价于verbosity=2
批量执行测试模块
unittest可以自动发信并执行给定目录下满足规格的测试模块.
规则是文件名必须是有效的标示符,文件名必须以test字符串开头,
1.程序文件模式
就是将测试发现代码编写再测试脚本中,然后直接执行脚本文件即可.
2.命令行模式
通过unittest单元测试框架提供的discover命令实现常用的断言方法
断言表示为一些布尔表达式
判断程序是否达到预期
断言为真,表示达到预期
断言为假,表示未达预期
unittest框架具有很大的断言,以assert***开头使用HTMLTestRunner生成HTML测试报告
前期准备
1>下载HTMLTestRunner.py文件
2>将该文件复制到Python安装路径下的lib文件夹中.
3>进入Python文件或者交互模式,执行import HTMLTestRunner,没有报错,说明配置成功.
4> 将测试结果报告写入指定的文件中