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爬取网站数据保存使用的方法
Nov 20 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
Django的models模型的具体使用
Jul 15 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
python实现梯度下降和逻辑回归
Mar 24 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
python tkinter模块的简单使用
Apr 07 Python
用Python爬取某乎手机APP数据
Jun 15 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
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python ElementTree 基本读操作示例
2009/04/09 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
中国宠物用品商城:E宠商城
2016/08/27 全球购物
物流管理毕业生自荐信
2013/10/24 职场文书
商务英语本科生的自我评价分享
2013/11/15 职场文书
房屋委托书范本
2014/04/04 职场文书
学前班评语大全
2014/05/04 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
总经理检讨书范文
2015/02/16 职场文书
二手房购房意向书
2015/05/09 职场文书
道歉情书大全
2015/05/12 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
解析python中的jsonpath 提取器
2022/01/18 Python
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python