一、什么是unittest
unittest是Python单元测试框架
1、Testcase:
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
2、Test suite:
多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
3、Test runner:
执行测试用例,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
4、TestLoader:
用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
5、Test fixture:
对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大。
使用unittest编写python的单元测试代码,包括如下几个步骤:
1、编写一个python类,继承 unittest模块中的TestCase类,这就是一个测试类
2、在上面编写的测试类中定义测试方法(这个就是指的测试用例),每个方法的方法名要求以 test 打头,没有额外的参数。 在该测试方法中 调用被测试代码,校验测试结果,TestCase类中提供了很多标准的校验方法,如 最常见的assertEqual。
3、执行 unittest.main() ,该函数会负责运行测试,它会实例化所有TestCase的子类,并运行其中所有以test打头的方法。
二、简单用法
unittest是python自带的一个单元测试框架,基本用法如下:
1.直接导入unittest模块:import unittest
2.需继承自unittest.TestCase的测试用例类,如class xxx(unittest.TestCase):
3.定义setUp和tearDown,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。
4.定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。
5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
6.调用unittest.main()启动测试或者利用suite集合执行
三、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)
四、例子一
调用unittest.main()启动测试
代码展示:
四、例子二
利用suite集合执行并生成测试报告HTML
代码展示:
执行结果:
其中BeautifulReport模块是用来生成报告的:一个基于unittest.TestResult模块实现的测试用例模板, 可把测试中的结果通过BeautifulReport整合成一个可视化的报表
报告生成展示:
五、将测试报告发送至指定邮箱
导入库:import smtplib
代码展示:
这里讲解一下重点:
1、message['Subject']是什么意思呢?为什么可以这样写呢?
等号左边的message['Subject']的变量是一个a['b']的代码形式,它类似字典根据键取值的表达,但是这里的message是一个MIMEText类的对象,并不是一个字典
需要注意的是,不是每一个类都可以这样访问其属性的,之所以能这样访问是因为这个MIMEText的类实现了这个功能。
message['Subject'] = XXXX 就是在为message['Subject']这个属性赋值。
2、注意:这里的密码并不是你邮箱的密码,而是需将SMTP服务开启,拿到授权码
五、升级:将测试报告定时发送至指定人邮箱
导入第三方库:import schedule
代码展示:
while循环,是去检查上面的任务部署情况,如果任务已经准备就绪,就去启动执行。其中time.sleep(1)是让程序按秒来检查,如果检查太快,会浪费计算机的资源。