python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)

利用python+unittest生成测试报告并定时指定人发送邮件(python+smtplib+unittest+beautifulReport)

一、什么是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)

python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第1张图片
四、例子一
调用unittest.main()启动测试
代码展示:
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第2张图片
四、例子二
利用suite集合执行并生成测试报告HTML
代码展示:
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第3张图片
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第4张图片
执行结果:
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第5张图片
其中BeautifulReport模块是用来生成报告的:一个基于unittest.TestResult模块实现的测试用例模板, 可把测试中的结果通过BeautifulReport整合成一个可视化的报表
报告生成展示:
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第6张图片
五、将测试报告发送至指定邮箱
导入库:import smtplib
代码展示:
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第7张图片

这里讲解一下重点:
1、message['Subject']是什么意思呢?为什么可以这样写呢?
等号左边的message['Subject']的变量是一个a['b']的代码形式,它类似字典根据键取值的表达,但是这里的message是一个MIMEText类的对象,并不是一个字典
需要注意的是,不是每一个类都可以这样访问其属性的,之所以能这样访问是因为这个MIMEText的类实现了这个功能。
message['Subject'] = XXXX 就是在为message['Subject']这个属性赋值。
2、注意:这里的密码并不是你邮箱的密码,而是需将SMTP服务开启,拿到授权码

五、升级:将测试报告定时发送至指定人邮箱
导入第三方库:import schedule
代码展示:
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第8张图片

while循环,是去检查上面的任务部署情况,如果任务已经准备就绪,就去启动执行。其中time.sleep(1)是让程序按秒来检查,如果检查太快,会浪费计算机的资源。

执行效果:
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第9张图片
python+unittest生成测试报告定时发送邮件(python+smtplib+unittest+beautifulReport)_第10张图片

你可能感兴趣的:(unittest)