Python单元测试unittest的具体使用示例


Posted in Python onDecember 17, 2018

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

unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。

unittest有四个比较重要的概念是test fixture, test case, test suite, test runner, 。

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

TestCase 也就是测试用例

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

TestLoader是用来加载TestCase到TestSuite中的

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

通过dir(unittest),我们可以看到unittest全部的属性和方法,他们的关系如下图所示。

Python单元测试unittest的具体使用示例

unittest主要类关系

正常调用unittest的流程是,TestLoader 自动将测试用例TestCase中加载到TestSuite里,TextTestRunner调用TestSuite的run方法,顺序执行里面的TestCase中以test开头的方法,并得到测试结果TestResult。在执行TestCase过程中,先进行SetUp()环境准备,执行测试代码,最后tearDown()进行测试的还原。

其中TestLoader在加载过程中,进行添加的TestCase是没有顺序的。一个TestCase里如果存在多个验证方法的话,会按照方法中test后方首字母的ascii码从小到大排序后执行。

可以通过手动调用TestSuite的addTest、addTests方法来动态添加TestCase,这样既可以确定添加用例的执行顺序,也可避免TestCase中的验证方法一定要用test开头。

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

import unittest

class MyTest(unittest.TestCase): # 继承unittest.TestCase
  def tearDown(self):
    # 每个测试用例执行之后做操作
    print('111')

  def setUp(self):
    # 每个测试用例执行之前做操作
    print('22222')

  @classmethod
  def tearDownClass(self):
  # 必须使用 @ classmethod装饰器, 所有test运行完后运行一次
     print('4444444')
  @classmethod
  def setUpClass(self):
  # 必须使用@classmethod 装饰器,所有test运行前运行一次
    print('33333')

  def test_a_run(self):
    self.assertEqual(1, 1) # 测试用例
    
  def test_b_run(self):
    self.assertEqual(2, 2) # 测试用例
    
if __name__ == '__main__':
  unittest.main()#运行所有的测试用例

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

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的测试报告,里面会有每个测试用例的执行结果,代码如下:

import HTMLTestRunner    
    import unittest
    class MyTest(unittest.TestCase):#继承unittest.TestCase
      def tearDown(self):
        #每个测试用例执行之后做操作
        print('111')
      def setUp(self):
        #每个测试用例执行之前做操作
        print(22222)
      def test_run(self):
        # self.assertEqual(1,1)
        self.assertIs(1,1)
        #测试用例
      def test_run2(self):
        # self.assertEqual(1,1)
        self.assertIs(1,1)
        #测试用例
      def test_run3(self):
        # self.assertEqual(1,1)
        self.assertIs(1,1)
        #测试用例
      def test_run1(self):
        # self.assertEqual(1,1)
        self.assertIs(1,1)
        #测试用例
    if __name__ == '__main__':
      test_suite = unittest.TestSuite()#创建一个测试集合
      test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例
      #test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法
      fp = open('res.html','wb')#打开一个保存结果的html文件
      runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='api测试报告',description='测试情况')
      #生成执行用例的对象
      runner.run(test_suite)
      #执行测试套件

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

import unittest,HTMLTestRunner
    suite = unittest.TestSuite()#创建测试套件
    all_cases = unittest.defaultTestLoader.discover('.','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)
    #运行测试

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

import unittest
import 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格式的报告了,而且还自动把日期加上了

Python单元测试unittest的具体使用示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python pdb调试方法分享
Jan 21 Python
python解析文件示例
Jan 23 Python
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
运动检测ViBe算法python实现代码
Jan 09 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
基于python实现把图片转换成素描
Nov 13 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 #Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 #Python
Python 通过调用接口获取公交信息的实例
Dec 17 #Python
python用插值法绘制平滑曲线
Feb 19 #Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 #Python
Python脚本完成post接口测试的实例
Dec 17 #Python
python:接口间数据传递与调用方法
Dec 17 #Python
You might like
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
CI框架中zip类应用示例
2014/06/17 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
php intval函数用法总结
2019/04/14 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
JS实现div居中示例
2014/04/17 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
js实现点击生成随机div
2020/01/16 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
Python使用plotly绘制数据图表的方法
2017/07/18 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
python3.5安装python3-tk详解
2019/04/26 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
Python 如何在字符串中插入变量
2020/08/01 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
售后服务科岗位职责范文
2013/11/13 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python