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使用代理抓取网站图片(多线程)
Mar 14 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
python openpyxl使用方法详解
Jul 18 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
python实现按关键字筛选日志文件
Dec 24 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
pytest配置文件pytest.ini的详细使用
Apr 17 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中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
python中int与str互转方法
2018/07/02 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
致1500米运动员广播稿
2014/02/07 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
男性健康日的活动方案
2014/08/18 职场文书
十佳家长事迹材料
2014/08/26 职场文书
高中生毕业评语
2014/12/30 职场文书
关于迟到的检讨书
2015/05/06 职场文书
大学生读书笔记大全
2015/07/01 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
python中tkinter复选框使用操作
2021/11/11 Python
SQL语句多表联合查询的方法示例
2022/04/18 MySQL