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实现协同过滤的教程
Apr 08 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
说一说Python logging
Apr 15 Python
python抓取文件夹的所有文件
Feb 27 Python
Django框架实现逆向解析url的方法
Jul 04 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
python 创建一维的0向量实例
Dec 02 Python
Python中内建模块collections如何使用
May 27 Python
python爬虫基础之urllib的使用
Dec 31 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
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
Smarty模板语法详解
2019/07/20 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
js中cookie的使用详细分析
2008/05/28 Javascript
Javascript 篱式条件判断
2008/08/22 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
python 七种邮件内容发送方法实例
2014/04/22 Python
Python导出DBF文件到Excel的方法
2015/07/25 Python
python3实现windows下同名进程监控
2018/06/21 Python
python基础梳理(一)(推荐)
2019/04/06 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
主管职责范文
2013/11/09 职场文书
厂长助理岗位职责
2013/12/27 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
食堂卫生管理制度
2015/08/04 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
团干部培训班心得体会
2016/01/06 职场文书
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL