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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
轻松实现python搭建微信公众平台
Feb 16 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
python中 logging的使用详解
Oct 25 Python
Python冲顶大会 快来答题!
Jan 17 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
Python实现查询剪贴板自动匹配信息的思路详解
Jul 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 checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
Typescript的三种运行方式(小结)
2019/09/18 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
销售经理岗位职责
2014/03/16 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
python之json文件转xml文件案例讲解
2021/08/07 Python
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA
Golang 字符串的常见操作
2022/04/19 Golang