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写的图片蜘蛛人代码
Aug 27 Python
9种python web 程序的部署方式小结
Jun 30 Python
python概率计算器实例分析
Mar 25 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
django 单表操作实例详解
Jul 30 Python
python实现在一个画布上画多个子图
Jan 19 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 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通过COM使用ADODB的简单例子
2006/12/31 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
javascript模拟命名空间
2015/04/17 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
Python使用MONGODB入门实例
2015/05/11 Python
python开发之函数定义实例分析
2015/11/12 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
python实现文件的分割与合并
2019/08/29 Python
python相对企业语言优势在哪
2020/06/12 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
硕士研究生自我鉴定
2013/11/08 职场文书
预备党员入党思想汇报
2014/01/04 职场文书
干部培训自我鉴定
2014/01/22 职场文书
小学生家长评语集锦
2014/01/30 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
酒店前台岗位职责
2015/04/16 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
自我检讨书怎么写
2015/05/07 职场文书
投诉书格式范本
2015/07/02 职场文书
班主任培训研修日志
2015/11/13 职场文书
终止合同协议书范本
2016/03/22 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技