Python unittest 简单实现参数化的方法


Posted in Python onNovember 30, 2018

Python unittest 理论上是不建议参数驱动的,其用例应该专注单元测试,确保每个method的逻辑正确。

引用Stack Overflow的一个答案,

“单元测试应该是独立的,没有依赖项的。这确保了每个用例都有非常具体而专一的测试反应。传入参数会破坏单元测试的这个属性,从而使它们在某种意义上无效。使用测试配置是最简单的方法,也是更合适的方法,因为单元测试不应该依赖外部信息来执行测试。那应该集成测试要做的。”

但是实际操作过程中,时不时还是有控制入参的需求的。比如,我想简单实现一个web功能的cross-browser测试……

下面列出一些学习到的解决方案 (ENV: WIN 10, python36)。

利用类的属性

这种方法可以不依赖其他第三方库,而且可以将参数化应用到setUpClass 和setUp方法中。

即可以顺利解决一个web 测试脚本cross-browser的验证的问题。

class TestOdd1(unittest.TestCase):
 NUMBER=1
 def runTest(self):
  """Assert that the item is odd"""
  self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")
 
class TestOdd2(TestOdd1):
 NUMBER=2
 
if __name__ == '__main__':
 unittest.main()

nose + ddt

用nose和ddt可以简单的完成参数控制的test case,实际应用的是python的装饰器(decorator)。

写出来有些类似cucumber gherkin当中的scenario outline。

在实验中,这个方法不适用于setUpClass。

pip install nose
pip install ddt
import unittest
from ddt import ddt, data
 
@ddt
class TestOdd(unittest.TestCase):
 
 @data(3, 4, 12, 23)
 def runTest(self, value):
  self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

执行 nosetests my_test.py ,4个test case被执行。

这个方案还支持从外部文件中加载参数。具体可以参考DDT 官方文档。

重写unittest.TestCase的构造函数

出处:Eli Bendersky的博客

定义类ParametrizedTestCase,使之集成unittest.TestCase并重写其构造函数,增加param这个参数。

import unittest
 
class ParametrizedTestCase(unittest.TestCase):
 """ TestCase classes that want to be parametrized should
  inherit from this class.
 """
 def __init__(self, methodName='runTest', param=None):
  super(ParametrizedTestCase, self).__init__(methodName)
  self.param = param
 
 @staticmethod
 def parametrize(testcase_klass, param=None):
  """ Create a suite containing all tests taken from the given
   subclass, passing them the parameter 'param'.
  """
  testloader = unittest.TestLoader()
  testnames = testloader.getTestCaseNames(testcase_klass)
  suite = unittest.TestSuite()
  for name in testnames:
   suite.addTest(testcase_klass(name, param=param))
  return suite

下面是一个包含我们用例的测试脚本,继承了ParametrizedTestCase,

class TestOne(ParametrizedTestCase):
 def test_something(self):
  print 'param =', self.param
  self.assertEqual(1, 1)
 
 def test_something_else(self):
  self.assertEqual(2, 2)

以参数驱动的方式执行用例

uite = unittest.TestSuite()
suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=42))
suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=13))
unittest.TextTestRunner(verbosity=2).run(suite)

将得到如下输出,

test_something (__main__.TestOne) ... param = 42
ok
test_something_else (__main__.TestOne) ... ok
test_something (__main__.TestOne) ... param = 13
ok
test_something_else (__main__.TestOne) ... ok
 
-----------------------------------------------
Ran 4 tests in 0.000s
 
OK

以上这篇Python unittest 简单实现参数化的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的choice()方法使用详解
May 15 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
分析Python读取文件时的路径问题
Feb 11 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
如何用Python绘制3D柱形图
Sep 16 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
python 对xml解析的示例
Feb 27 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
pytorch中的model=model.to(device)使用说明
May 24 Python
opencv检测动态物体的实现
Jul 21 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 #Python
python3实现名片管理系统
Nov 29 #Python
Python中fnmatch模块的使用详情
Nov 30 #Python
pycharm 解除默认unittest模式的方法
Nov 30 #Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 #Python
基于python实现名片管理系统
Nov 30 #Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 #Python
You might like
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
jQuery中:has选择器用法实例
2014/12/30 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
Vue.JS入门教程之事件监听
2016/12/01 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Python自定义线程池实现方法分析
2018/02/07 Python
python删除某个字符
2018/03/19 Python
python机器学习之随机森林(七)
2018/03/26 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
口腔医学技术应届生求职信
2013/11/09 职场文书
教育科研先进个人材料
2014/01/26 职场文书
2014年节能工作总结
2014/12/18 职场文书
道德与公民自我评价
2015/03/09 职场文书