unittest作为单元测试框架以一个标准模块放入python的开发包中,测试框架可以提供用例的组织与执行,提供丰富的验证比较方法和丰富的日志,能够帮助我们更好的组织自动化测试用例。
一、unitest中几个重要的概念
1、Test Case
一个Test Case的实例就是一个测试用例,一个测试用例就是一个完整的测试流程,它包括测试前准备 setUp() ,实现测试过程的代码run(),以及测试完成之后的环境还原tearDown() ;测试单元unit test 就是一个完整的测试用例,通过这个单元测试可以对程序的某个功能进行验证
2、Test Suite
一个功能点的验证往往包含多个测试用例,多个测试用例集合到一起就组成一个测试集 TestSuite ,通过addTest()加载Test Case到 TestSuite中
3、Test Runner
测试用例的执行,我们可以执行单个测试用例也可以执行整个测试集,通过TextTestRunner类提供的run()方法来执行
4、Test Fixture
对一个测试用例从环境的前期搭建到销毁就是一个fixture ,通过覆盖test case 的setUp()和tearDown()方法来实现
二、unittest 编写用例
1、我们先定义一个sumFunc.py文件,给出一个计算两数之和的方法
2、 编写一个unittest的用例test01.py文件:
我们的TestCount类继承类unittest模块中的TestCase类,使用asserEqual方法对sumNum()方法进行断言,而省去类被注释掉的代码,常用的断言方法有:asserEqual(a,b)、assertTrue(a)、assertIs(a,b)、assertIsNone(x)等等
3、组织单元测试用例
首先,我们在sumFunc.py文件中再增加一个subNum()方法用来计算两个数的减法,然后在test01.py文件中新增这个方法的断言验证
然后,我们开始组织用例
上面的例子中创建了TestCount()和TestSub()两个类,分别测试sumFunc.py文件中的sumNum()和subNum()两个功能,通过TestSuite类的addTest()方法把不同的测试类中的测试方法组装到测试集中,最后执行结果如下:
三、Testloader用例识别
从上面简单的例子中可以看到我们的测试集需要添加所有的case去执行,实际项目中我们的case可以按照功能划分有成百上千条用例,这时我们就可以用Testloader类提供discover()方法自动识别测试用例
discover(start_dir, pattern='test*.py', top_level_dir=None)
这样,只要我们的测试case按照pattern给定的规则命名,就能自动的识别到测试用例去run()
四、用例类型
1、在实际应用中我们会需要根据特定的场景和条件选择跳过不去执行某些用例,在unittest中提供了这样的功能:
unitest.skip(reason) #跳过装饰的测试,并给出原因
unitest.skipIf(condition,reason) #跳过装饰的测试,当满足条件时
unitest.skipUnless(condition,reason) #跳过装饰的测试,除非满足条件时
unitest.expectedFailure() #该装饰的测试统一标记为失败
2、上 面我们提到fixtures可以看作是setUp/tearDown和中间的测试用例,除此之外,unit test还有对测试类和测试模块的fixtures
setUpModule/tearDownModule :在整个模块的开始和结束时被执行
setUpClass/tearDownClass :在测试类的开始和结束时被执行
setUp/tearDown :在测试用例的开始和结束时被执行
五、测试报告
在测试执行完成之后我们需要将用例的结果写入到log文件中,简单的我们可以直接写入文件
python runtest.py >> report/log.txt 2>&1
实际项目中我们一般要加入些report插件来更直观美化的呈现测试报告,HTMLTestRunner是python标准库unittest单元测试框架的一个扩展,它生成易于使用的HTML报告,下载地址:
http://tungwaiyip.info/software/HTMLTestRunner.html
将HTMLTestRunner.py(python 2和python 3有些方法不一致需要修改一点)文件加入到我们的python安装目录中,然后import HTMLTestRunner
fp = open('./result.html', 'wb')
runner = HTMLTestRunner(stream=fp,title='测试报告标题', description='测试报告描述')
runner.run(testunit)
fp.close
1、HTMLTestRunner可以读取到doc string类的注释(‘’‘ ’‘’),所以我们可以给每个测试用例通过添加注释就能在报告中展示每条用例的名称
2、我们可以使用用例执行时间来存储每次报告的文件名称
now = time.strftime("%Y-%m-%d %H_%M_%S")
filename = './' + now + 'result.html'
fp = open(filename,'wb')
3、发送测试报告邮件,python的smtplib模块提供sendmail方法让我们发送邮件
我们需要设置邮箱的服务器、发送邮箱、接受邮箱、邮件主题、邮件附件等等
网友评论