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实现树的先序、中序、后序排序算法示例
Jun 23 Python
python中 logging的使用详解
Oct 25 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
python 梯度法求解函数极值的实例
Jul 10 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
Python线程指南分享
Nov 19 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
Python如何给函数库增加日志功能
Aug 04 Python
python实现简单贪吃蛇游戏
Sep 29 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 Python
python3中apply函数和lambda函数的使用详解
Feb 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
UCenter Home二次开发指南
2009/05/28 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
js实时获取系统当前时间实例代码
2013/06/28 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
用Python解决计数原理问题的方法
2016/08/04 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
Django框架模板介绍
2019/01/15 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
家居设计专业个人自荐信范文
2013/11/26 职场文书
2014年司法局工作总结
2014/12/11 职场文书
千与千寻观后感
2015/06/04 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
详解Python魔法方法之描述符类
2021/05/26 Python
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL
再谈python_tkinter弹出对话框创建
2022/03/20 Python
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL