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使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
Python使用sorted排序的方法小结
Jul 28 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
Python实现通过解析域名获取ip地址的方法分析
May 17 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
简单了解Python变量作用域正确使用方法
Jun 12 Python
python接入支付宝的实例操作
Jul 20 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
Python3如何使用range函数替代xrange函数
Oct 05 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
星际RPG字典
2020/03/04 星际争霸
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
js异或加解密效果代码
2008/06/25 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
导游个人求职信范文
2014/03/23 职场文书
网络信息安全承诺书
2014/03/26 职场文书
高中生操行评语大全
2014/04/25 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
导游词之吉林花园山
2019/10/17 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
Html5调用企业微信的实现
2021/04/16 HTML / CSS
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js