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笔记(2)
Oct 24 Python
Python中的字符串查找操作方法总结
Jun 27 Python
python 调用win32pai 操作cmd的方法
May 28 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
Django获取应用下的所有models的例子
Aug 30 Python
python文件操作的简单方法总结
Nov 07 Python
python做接口测试的必要性
Nov 20 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
Python内置数据结构列表与元组示例详解
Aug 04 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
什么是python的必选参数
2020/06/21 Python
网络技术支持面试题
2013/04/22 面试题
揭牌仪式主持词
2014/03/19 职场文书
欢迎标语大全
2014/06/21 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
alibaba seata服务端具体实现
2022/02/24 Java/Android
mysql的Buffer Pool存储及原理
2022/04/02 MySQL
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫