Python paramunittest模块实现Excel数据驱动测试详解

拾柒
拾柒
发布时间:2026-10-13 | 6人浏览过
原创

本文详细介绍如何在Python中使用paramunittest模块实现基于Excel的数据驱动测试。通过列表、元组和字典三种数据结构传入多组参数,自动生成多个测试用例。文章包含具体的代码示例、运行结果分析以及常见错误(如元组单值报错)的解决方案,帮助开发者高效构建自动化测试框架。

paramunittest模块安装与核心概念

一、总结说明

在Windows环境下安装paramunittest模块,只需在命令行输入命令:pip install paramunittest。

核心要点总结:

1. paramunittest是专为unittest框架实现参数化的模块,支持传入多组参数并自动生成多个测试用例。 2. 导入方式:import paramunittest。 3. paramunittest支持字典、元组、列表作为输入参数: - 列表格式:[["value"],["value2"]]。setParameters赋值的参数个数需与列表中的列值数量一一对应。例如,若列表格式中每行只有一个值,则setParameters中只能定义一个参数。 - 元组格式:(("pwd","value"),("pwd","value2")). 元组中的列值必须保证有两个以上。如果只有一个值,调用setParameters时会报错。setParameters赋值的个数需与列值一一对应。例如,元组格式中有2个列值,则setParameters中需定义2个参数。 - 字典格式:[{"key": "value"},{"key": "value2"}]。字典需保证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. 列表/元组获取列值的方法:在testcase中访问self.t1等属性。 7. 字典单赋予列值的定义方式:def setParameters(self, key, keyN): '''注意key, keyN需与字典中的key值一一对应''' self.key = key self.keyN = keyN 8. 列表/元组获取列值:在testcase中访问self.key1,字典通过key获取value值。 特别注意:当列值下标大于10时,执行顺序是先执行0, 1,再执行10, 11,接着执行2, 3, ..., 9。

基于列表的参数化测试示例

二、源码举例(列表)

说明:通常读取Excel文件会生成一个列表数据结构,如果使用Excel作为参数化数据源,可以参考此示例。


#!/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 相关产品和应用

全部下载

专题列表