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中生成Epoch的方法
Apr 26 Python
Python内建模块struct实例详解
Feb 02 Python
python简单商城购物车实例代码
Mar 15 Python
解决python 输出是省略号的问题
Apr 19 Python
python: 判断tuple、list、dict是否为空的方法
Oct 22 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
python 字典操作提取key,value的方法
Jun 26 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Tensorflow 多线程设置方式
Feb 06 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
Python基于pandas爬取网页表格数据
May 11 Python
python异常中else的实例用法
Jun 15 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模拟asp中response类实现方法
2015/08/08 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
Js的MessageBox
2006/12/03 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
Python 开发Activex组件方法
2009/11/08 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
Python修改列表值问题解决方案
2020/03/06 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
英国最大的笔记本电脑直销专家:Laptops Direct
2019/07/20 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
医学求职自荐信
2014/06/21 职场文书
中学生学习保证书
2015/02/26 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang
工厂无线对讲系统解决方案
2022/02/18 无线电
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电