Python基于paramunittest模块实现excl参数化


Posted in Python onApril 26, 2020

一、总结说明

Windows环境安装:paramunittest cmd输入命令:pip install paramunittest

总结说明:

1.paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例
2.导入paramunittest:import paramunittest
3.paramunittest支持字典、元组、列表作为入参
列表格式:[["vaule"],["vaule2"]],setParameters赋值的个数与列值一一对应,例如此列表格式列值只有一个,赋值时只能自定义一个值
元组格式:(("pwd","vaule"),("pwd","vaule2")),元组列值必须保证两个以上,如果只有一个值,setParameters时报错,setParameters赋值的个数与列值一一对应,例如此元组格式列值有2个,赋值时只能自定义2个值
字典格式:[{"key": "vaule" },{"key": "vaule2"}],字典保证key值一致,如相同个数,相同位置,例如此字典格式列值只有一个key,setParameters赋值时只能定义一个key值
4.赋予列表/字典/元组值:@paramunittest.parametrized(*list/tuple)
5.列表元组赋予列值:def setParameters(self, t1, t2, tN):
'''注意t1, t2, t3名称自定义,从左到右按顺序一一对应值'''
self.t1 = t1
self.t2 = t2
self.tN = tN
6.列表元组取列值def testcase(self): self.t1
7.字典单赋予列值:def setParameters(self, key, keyN):
'''注意key, keyN是与字典key值必须一一对应'''
self.key = key
self.keyN = keyN
8.列表元组取取列def testcase(self): self.key1,字典通过key获取vaulue值
特别注意:如列值下标大于10时,执行顺序是先执行0,1再执行10,11,再执行2,3,.....9

二、源码举例(列表)

说明:一般读取exel会生成一个列表,如果使用exel作为参数化,可以参考此

#!/usr/bin/python3
# encoding:utf-8
import unittest
import paramunittest
import time

list =[
  ['test', '123456', 'true'], 
  ['test1', '1234564', 'true']
]

@paramunittest.parametrized(*list)
class TestDemo(unittest.TestCase):
  def setParameters(self, user, pwd, result):
    '''注意user, pwd, result是从左到右按顺序一一对应'''
    self.user = user
    self.pwd = pwd
    self.result = result

  def testcase(self):
    print("开始执行用例:--------------")
    time.sleep(1)
    print("输入用户名:%s" % self.user)
    print("输入密码:%s" % self.pwd)
    print("期望结果:%s " % self.result)
    time.sleep(1)
    self.assertTrue(self.result == "true")
if __name__ == "__main__":
  #verbosity=2 显示用例执行详情
  unittest.main(verbosity=2)

运行结果

testcase (paramunittest.TestDemo_0) ... 开始执行用例:--------------
输入用户名:test
输入密码:123456
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_1) ... 输入用户名:test1
输入密码:1234564
期望结果:true
ok

----------------------------------------------------------------------
Ran 2 tests in 4.003s

OK

三、源码举例(字典)

#!/usr/bin/python3
# encoding:utf-8
import unittest
import paramunittest
import time
dict =[
  {"user": "test", "pwd": "123456", "result": "true"},
  {"user": "test1", "pwd": "1234564", "result": "true"},
  {"user": "test2", "pwd": "1234564", "result": "true"},
  {"user": "test3", "pwd": "1234564", "result": "true"},
  {"user": "test4", "pwd": "1234564", "result": "true"},
  {"user": "test5", "pwd": "1234564", "result": "true"},
  {"user": "test6", "pwd": "1234564", "result": "true"},
  {"user": "test7", "pwd": "1234564", "result": "true"},
  {"user": "test8", "pwd": "1234564", "result": "true"},
  {"user": "test9", "pwd": "1234564", "result": "true"},
  {"user": "test10", "pwd": "1234564", "result": "true"},
  {"user": "test11", "pwd": "1234564", "result": "true"}
]
@paramunittest.parametrized(*dict)
class TestDemo(unittest.TestCase):
  def setParameters(self, user, pwd, result):
    '''user, pwd, result三个参数字典的key一一对应'''
    self.user = user
    self.pwd = pwd
    self.result = result

  def testcase(self):
    print("开始执行用例:--------------")
    time.sleep(1)
    print("输入用户名:%s" % self.user)
    print("输入密码:%s" % self.pwd)
    print("期望结果:%s " % self.result)
    time.sleep(1)
    self.assertTrue(self.result == "true")
if __name__ == "__main__":
  #verbosity=2 显示用例执行详情
  unittest.main(verbosity=2)

运行结果

#说明:框架问题:当字典大于10时,执行顺序是先执行0,1再执行10,11,再执行#2,3,.....9
testcase (paramunittest.TestDemo_0) ... 开始执行用例:--------------
输入用户名:test
输入密码:123456
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_1) ... 输入用户名:test1
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_10) ... 输入用户名:test10
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_11) ... 输入用户名:test11
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_2) ... 输入用户名:test2
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_3) ... 输入用户名:test3
输入密码:1234564
期望结果:true
ok开始执行用例:--------------

testcase (paramunittest.TestDemo_4) ... 输入用户名:test4
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_5) ... 输入用户名:test5
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_6) ... 输入用户名:test6
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_7) ... 输入用户名:test7
输入密码:1234564
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_8) ... 输入用户名:test8
输入密码:1234564
期望结果:true
ok开始执行用例:--------------

testcase (paramunittest.TestDemo_9) ... 输入用户名:test9
输入密码:1234564
期望结果:true
ok

----------------------------------------------------------------------
Ran 12 tests in 24.018s

OK

四、源码举例(元组)

#!/usr/bin/python3
# encoding:utf-8
import unittest
import paramunittest
import time

tuple=(
  ("test","123456","true"),
  ("test1","1234564","true")
  )


#另一种赋值方式:直接赋值
#@paramunittest.parametrized(
#  ("test","123456","true"),
#  ("test1","1234564","true")
#)

@paramunittest.parametrized(*tuple)
class TestDemo(unittest.TestCase):
  def setParameters(self, user, pwd, result):
    '''注意user, pwd, result是从做到右按顺序一一对应'''
    self.user = user
    self.pwd = pwd
    self.result = result

  def testcase(self):
    print("开始执行用例:--------------")
    time.sleep(1)
    print("输入用户名:%s" % self.user)
    print("输入密码:%s" % self.pwd)
    print("期望结果:%s " % self.result)
    time.sleep(1)
    self.assertTrue(self.result == "true")
if __name__ == "__main__":
  #verbosity=2 显示用例执行详情
  unittest.main(verbosity=2)

运行结果

testcase (paramunittest.TestDemo_0) ... 开始执行用例:--------------
输入用户名:test
输入密码:123456
期望结果:true
ok
开始执行用例:--------------
testcase (paramunittest.TestDemo_1) ... 输入用户名:test1
输入密码:1234564
期望结果:true
ok

----------------------------------------------------------------------
Ran 2 tests in 4.002s

OK

五、问题:

问题描述:一个元组只有一个列值,如("test"),("test1"),setParameters之后运行报错如下:

testcase (paramunittest.TestDemo_0) ... ERROR
testcase (paramunittest.TestDemo_1) ... ERROR

======================================================================
ERROR: testcase (paramunittest.TestDemo_0)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\pythonaz\lib\site-packages\paramunittest.py", line 89, in setUp
self.setParameters(*parameters[0], **parameters[1])
TypeError: setParameters() takes 2 positional arguments but 5 were given

解决方法:保证一个元组列值两个以上,如("test","123456"),("test1","123")

注:只有元组有这个问题,列表或字典无此问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的高级Git库 Gittle
Sep 22 Python
Python使用爬虫猜密码
Feb 19 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python实现ping指定IP的示例
Jun 04 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
Python实现快速大文件比较代码解析
Sep 04 Python
如何用Django处理gzip数据流
Jan 29 Python
python自动化八大定位元素讲解
Jul 09 Python
在python里创建一个任务(Task)实例
Apr 25 #Python
python 实现任务管理清单案例
Apr 25 #Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 #Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 #Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 #Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 #Python
解决python父线程关闭后子线程不关闭问题
Apr 25 #Python
You might like
discuz安全提问算法
2007/06/06 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
js综合应用实例简单的表格统计
2013/09/03 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
2015/01/20 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
讲解Python中的递归函数
2015/04/27 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
Python yield 使用方法浅析
2017/05/20 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
中国梦读书活动总结
2014/07/10 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
Java 多态分析
2022/04/26 Java/Android