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 with statement 进行文件操作指南
Aug 22 Python
在Python中给Nan值更改为0的方法
Oct 30 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
Django 全局的static和templates的使用详解
Jul 19 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
django框架F&Q 聚合与分组操作示例
Dec 12 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
基于python实现对文件进行切分行
Apr 26 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
k-means & DBSCAN 总结
Apr 27 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 echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python文件去除注释的方法
2015/05/25 Python
使用python实现rsa算法代码
2016/02/17 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
python实现简单图书管理系统
2019/11/22 Python
python怎么判断模块安装完成
2020/06/19 Python
英语专业推荐信
2013/11/16 职场文书
《梅花魂》教学反思
2014/04/30 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
小学教师求职信范文
2015/03/20 职场文书
redis实现排行榜功能
2021/05/24 Redis
Mysql 文件配置解析介绍
2022/05/06 MySQL
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL