博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之使用单元测试框架unittest执行自动化测试
阅读量:6707 次
发布时间:2019-06-25

本文共 5548 字,大约阅读时间需要 18 分钟。

Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。

单元测试框架即一堆工具的集合。

在说unittest之前,先说几个概念:

TestCase 也就是测试用例

TestSuite 多个测试用例集合在一起,就是TestSuite

TestLoader是用来加载TestCase到TestSuite中的

TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

unittest单元测试 --- “代码驱动”(用例是用代码写的),也支持“数据驱动”,将数据存在文件里去取数据

atp-根据excel,用例写在Excel里的,属于“数据驱动”

 

  下面写一个简单的单元测试用例

import unittest #导入unittestdef calc(a,b):    return a/bclass TestCalc(unittest.TestCase): # 继承unittest.TestCase    @classmethod    def setUpClass(cls): #必须使用 @ classmethod装饰器, 所有test运行之前运行一次        print('我是setupClass')    @classmethod    def tearDownClass(cls): #必须使用 @ classmethod装饰器, 所有test运行结束后运行一次        print('我是tearDownClass')    def setUp(self):#每条用例执行之前都会先执行它        print('我是setup')    def tearDown(self):#每条用例执行之后都会执行它        print('我是teardown')    def test_calc1(self): #下面的三引号/双引号中显示的是描述信息        '''测试正常的'''        # result = calc(2,1)        # self.assertEqual(2,result,'除法运算不正确')        print('calc1')    def test_calc2(self):        print('calc2')        "测试异常的"        # result = calc(2, 2)        # self.assertEqual(1,2,'结果不正确')    def test_mysql(self):        '''测试mysql'''        print('test_mysql')    def test_login(self):        '''测试登录'''        print('print test_login')    def test_abc(self):        print('abc')    def test_zbc(self):        print('zbc')    def test_fail(self):        self.assertEqual(1,2,msg='测试失败的') #msg表示如果代码执行失败,则打印的信息unittest.main() #运行当前文件里面的所有测试用例#执行顺序:执行所有以test开头的方法/用例,且按照方法/用例名称A-Z顺序执行,而不是按照书写顺序

 

#以上代码运行结果如下:我是setupClass...F...======================================================================我是setupFAIL: test_fail (__main__.TestCalc)abc我是teardown我是setupcalc1我是teardown----------------------------------------------------------------------我是setupcalc2Traceback (most recent call last):我是teardown  File "E:/Python学习/pycharm/python脚本/day12/单元测试unittest.py", line 58, in test_fail我是setup我是teardown    self.assertEqual(1,2,msg='测试失败的') #msg表示如果代码执行失败,则打印的信息我是setupAssertionError: 1 != 2 : 测试失败的print test_login我是teardown我是setup----------------------------------------------------------------------test_mysqlRan 7 tests in 0.001s我是teardown我是setupFAILED (failures=1)zbc我是teardown我是tearDownClass

 

  下面是一些常用的断言,也就是校验结果

assertEqual(a, b)     a == b              assertNotEqual(a, b)     a != b              assertTrue(x)     bool(x) is True              assertFalse(x)     bool(x) is False              assertIsNone(x)     x is None             assertIsNotNone(x)     x is not None           assertIn(a, b)     a in b            assertNotIn(a, b)     a not in b

 

 

那如何生成一个测试报告呢,需要加入另外一个模块了,HTMLTestRunner,这个模块需要自己安装,使执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果

HTML TestRunner:

用来产生测试报告的HTML TestRunner放入python安装目录下(sys.path目录),在打开pycharm的External Libraries -> Python 3.6.5有显示目录(C:\ProgramData\Anaconda3)
使用的时候直接 import HTML TestRunner即可

代码如下:

# test_suite = unittest.TestSuite() #创建一个测试集合# test_suite.addTest(TestCalc('test_zbc')) #测试套件中添加测试用例if __name__ == '__main__':    # 产生不好看的报告:HTMLTestRunner    f = open('report.html','wb') #打开一个保存结果的HTML文件    runner = HTMLTestRunner.HTMLTestRunner(stream=f, description='测试报告里面的描述', title='接口测试报告') #生成执行用的对象    test_suite = unittest.makeSuite(TestCalc) #把这个类变成一个测试集合    runner.run(test_suite)#运行用例套件

 

#以上代码执行结果...F...我是setupClass我是tearDownClass<_io.TextIOWrapper name='
' mode='w' encoding='UTF-8'> Time Elapsed: 0:00:00

 

用浏览器打开的测试报告显示如图:

 

 如果我们有很多个模块,每个模块下面都写了很多python文件,每个python文件里面都有测试用例,那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的所有python文件,然后找到里面的测试用例,逐个执行,代码如下:

import unittest,HTMLTestRunner        suite = unittest.TestSuite()#创建测试套件        all_cases = unittest.defaultTestLoader.discover(case_path,'test_*.py')        #找到某个目录下所有的以test开头的Python文件里面的测试用例        for case in all_cases:            suite.addTests(case)#把所有的测试用例添加进来        fp = open('res.html','wb')        runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况')        runner.run(suite)        #运行测试

 

还可以用BeautifulReport产生好看的测试报告

解压文件夹->将文件夹和setup.py复制到day12(当前要使用的目录)中 -》运行setup.py -》运行成功之后(运行结果显示success)把day12中的BeautifulReport文件夹删除

使用的时候直接 import BeautifulReport即可
以上方法不行的话,将BeautifulReport解压后的文件夹放入pycharm的External Libraries -> site-packages目录下
使用BeautifulReport,执行代码如下:

import BeautifulReport as bf#产生好看的报告test_suite = unittest.makeSuite(TestCalc) #把这个类变成一个测试集合runner = bf.BeautifulReport(test_suite)runner.report(filename='new_report.html',description='描述') #文件名必须是html格式的
#以上代码执行结果如下:我是setupClass...F...我是tearDownClass测试已全部完成, 可前往E:\Python学习\pycharm\python脚本\day12查询测试报告

用浏览器打开的测试报告显示如图:

 用BeautifulReport执行多个python文件里的多个测试用例,代码如下:

import unittestimport BeautifulReportimport timetests = unittest.defaultTestLoader.discover(case_path,'*.py') #找指定路径下以.py结尾的文件runner = BeautifulReport.BeautifulReport(tests)#运行找到的所有用例today = time.strftime('%Y-%m-%d%H%M%S')file_name = '%s-report.html'%today #报告文件名runner.report('utp自动化测试报告-%s'%today,filename=file_name,log_path=report_path)#产生报告

 

我们在后续进行持续集成的时候,要让代码自动运行,就会用到Jenkins了,但是上面产生的测试报告都是html格式的,Jenkins不认识,就在Jenkins里面显示不出来。那咱们就要产生一些Jenkins认识的测试报告,Jenkins认识xml格式的报告,那咱们就产生xml格式的呗,就需要用一个新的模块,xmlrunner,安装直接 pip install xmlrunner即可,代码如下:

import unittestimport xmlrunner#导入这个模块 class My(unittest.TestCase): def test1(self,a,b,c): self.assertEqual(a+b,c) if __name__=='__main__': test_suite = unittest.TestSuite() test_suite.addTest(unittest.makeSuite(My)) runner = xmlrunner.XMLTestRunner(output='report')#指定报告放的目录 runner.run(test_suite)

然后咱们运行,可以看到在report目录下已经产生了xml格式的报告了,而且还自动把日期加上了

 

转载于:https://www.cnblogs.com/denise1108/p/10339068.html

你可能感兴趣的文章
HDU 2070 Fibbonacci Number
查看>>
Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView
查看>>
Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
查看>>
好玩的注释
查看>>
【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介-2(补充)...
查看>>
Maven编译代码的相关命令
查看>>
stingray 页面布局与设计
查看>>
江南白衣整理和开发的java常用工具类
查看>>
Android.mk 文件语法详解
查看>>
android的armeabi和armeabi-v7a
查看>>
android自己定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件
查看>>
emacs的常用配置备份
查看>>
lvs之 lvs+nginx+tomcat_1、tomcat_2+redis(lvs dr 模式)
查看>>
让js中的函数只有一次有效调用的三种常用方法
查看>>
python实现算24的算法
查看>>
Extending a logical volume in a virtual machine running Red Hat or Cent OS (1006371)
查看>>
操作xml格式的字符串的方法(C#)
查看>>
[转]MySQL索引详解(1)
查看>>
poj 3040 Allowance 贪心
查看>>
分享27款最佳的复古风格 WordPress 主题
查看>>