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 相关文章推荐
有关wxpython pyqt内存占用问题分析
Jun 09 Python
在Python的Django框架中实现Hacker News的一些功能
Apr 17 Python
python reduce 函数使用详解
Dec 05 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
Ubuntu下Anaconda和Pycharm配置方法详解
Jun 14 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
Django中FilePathField字段的用法
May 21 Python
python实现经纬度采样的示例代码
Dec 10 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 Python
Python的这些库,你知道多少?
Jun 09 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
JavaScript中实现块作用域的方法
2010/04/01 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
详解react-redux插件入门
2018/04/19 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
2020/08/28 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
python3 配置logging日志类的操作
2020/04/08 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
蒂娜商店:Tiina the Store
2019/12/07 全球购物
应届生财务管理求职信
2013/11/06 职场文书
大学军训感言800字
2014/02/27 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis