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安装第三方库及常见问题处理方法汇总
Sep 13 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
Django权限机制实现代码详解
Feb 05 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Python中常用的内置方法
Jan 28 Python
Django中的cookie和session
Aug 27 Python
如何基于python实现脚本加密
Dec 28 Python
django 实现手动存储文件到model的FileField
Mar 30 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
python 制作本地应用搜索工具
Feb 27 Python
字典算法实现及操作 --python(实用)
Mar 31 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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常用字符串的总结(待续)
2013/06/07 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
PHP安全下载文件的方法
2016/04/07 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
Python 编码处理-str与Unicode的区别
2016/09/06 Python
python版DDOS攻击脚本
2019/06/12 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
python实现贪吃蛇双人大战
2020/04/18 Python
python程序需要编译吗
2020/06/19 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
英国电器零售商:PRC Direct
2018/06/21 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
学校师德承诺书
2014/05/23 职场文书
端午节活动总结报告
2015/02/11 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
详解Python描述符的工作原理
2021/06/11 Python
基于Python实现nc批量转tif格式
2022/08/14 Python