背景

本文总结pytest的测试用例参数化。

说明

软件测试中,输入相应值,检查期望值,是常见测试方法。
在自动化测试中,一个测试用例对应一个测试点,通常一组测试数据无法完全覆盖测试范围,所以,需要参数化来传递多组数据。

pytest的测试用例参数化使用如下装饰器即可完成。

@pytest.mark.parametrize(argnames, argvalues)
# 参数:
# argnames:以逗号分隔的字符串
# argvaluse: 参数值列表,若有多个参数,一组参数以元组形式存在,包含多组参数的所有参数
# 以元组列表形式存在

示例:

参数化之一个参数。

# ./test_case/test_func.py
import pytest

@pytest.mark.parametrize("arg_1", [4399, 2012])
def test_add_by_func_aaa(arg_1):
 print(arg_1)
 
# ./run_test.py
import pytest

if __name__ == '__main__':
 pytest.main(['-v','-s'])
 
'''
============================= test session starts =============================
platform win32 -- Python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- D:\Python3.7\python.exe
cachedir: .pytest_cache
rootdir: D:\Python3.7\project\pytest, inifile: pytest.ini
plugins: allure-pytest-2.8.9, rerunfailures-8.0
collecting ... collected 2 items

test_case/test_func.py::test_add_by_func_aaa[4399] 4399
PASSED
test_case/test_func.py::test_add_by_func_aaa[2012] 2012
PASSED

============================== 2 passed in 0.04s ==============================
[Finished in 1.3s]
''' 

参数化之多个参数。

# ./test_case/test_func.py
import pytest  

@pytest.mark.parametrize("arg_1, arg_2", [(4399, 'AAAA'), (2012, 'BBBB')])
def test_add_by_func_aaa(arg_1,arg_2):
 print("arg_1:{}  arg_2:{}".format(arg_1, arg_2))

# ./run_test.py
import pytest

if __name__ == '__main__':
 pytest.main(['-v','-s'])
 
'''
============================= test session starts =============================
platform win32 -- Python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- D:\Python3.7\python.exe
cachedir: .pytest_cache
rootdir: D:\Python3.7\project\pytest, inifile: pytest.ini
plugins: allure-pytest-2.8.9, rerunfailures-8.0
collecting ... collected 2 items

test_case/test_func.py::test_add_by_func_aaa[4399-AAAA] arg_1:4399  arg_2:AAAA
PASSED
test_case/test_func.py::test_add_by_func_aaa[2012-BBBB] arg_1:2012  arg_2:BBBB
PASSED

============================== 2 passed in 0.05s ==============================
[Finished in 1.3s]
'''  

以上第2个示例,展现的是一个测试用例有两个参数,然后参数化了两组数据。

但在实际测试中,有的场景,比如多条件查询,比如有2个查询条件,每个条件有3个选项,如果要全部覆盖,则是3*3==9种情况。这种情景,人工测试一般是不会全部覆盖的,但在自动化测试中,只要你想,就可以做到。如下示例:

如下格式参数化,其测试结果为所有参数选项数量的乘积。

# ./test_case/test_func.py
import pytest
from func import *

'''
class TestFunc:

 # 正常测试用例
 def test_add_by_class(self):
  assert add(2,3) == 5


 def test_add_by_class_11(self):
  assert add(2,3) == 5
'''  

@pytest.mark.parametrize("arg_1", [4399,  2012, 1997])
@pytest.mark.parametrize("arg_2", ['AAAA', 'BBBB', 'CCCC'])
def test_add_by_func_aaa(arg_1,arg_2):
 print("arg_1:{}  arg_2:{}".format(arg_1, arg_2))
 

# ./run_test.py
import pytest

if __name__ == '__main__':
 pytest.main(['-v','-s'])
  
 
'''
============================= test session starts =============================
platform win32 -- Python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- D:\Python3.7\python.exe
cachedir: .pytest_cache
rootdir: D:\Python3.7\project\pytest, inifile: pytest.ini
plugins: allure-pytest-2.8.9, rerunfailures-8.0
collecting ... collected 9 items

test_case/test_func.py::test_add_by_func_aaa[AAAA-4399] arg_1:4399  arg_2:AAAA
PASSED
test_case/test_func.py::test_add_by_func_aaa[AAAA-2012] arg_1:2012  arg_2:AAAA
PASSED
test_case/test_func.py::test_add_by_func_aaa[AAAA-1997] arg_1:1997  arg_2:AAAA
PASSED
test_case/test_func.py::test_add_by_func_aaa[BBBB-4399] arg_1:4399  arg_2:BBBB
PASSED
test_case/test_func.py::test_add_by_func_aaa[BBBB-2012] arg_1:2012  arg_2:BBBB
PASSED
test_case/test_func.py::test_add_by_func_aaa[BBBB-1997] arg_1:1997  arg_2:BBBB
PASSED
test_case/test_func.py::test_add_by_func_aaa[CCCC-4399] arg_1:4399  arg_2:CCCC
PASSED
test_case/test_func.py::test_add_by_func_aaa[CCCC-2012] arg_1:2012  arg_2:CCCC
PASSED
test_case/test_func.py::test_add_by_func_aaa[CCCC-1997] arg_1:1997  arg_2:CCCC
PASSED

============================== 9 passed in 0.06s ==============================
[Finished in 1.4s]
'''

总结

以上,就是我们测试中使用的pytest测试用例参数化。

当然,如实际需要,你也可以把测试数据独立到文件里。然后读取出来,传递给@pytest.mark.parametrize(argnames, argvalues)装饰器

到此这篇关于pytest实现测试用例参数化的文章就介绍到这了,更多相关pytest 测试用例参数化内容请搜索程序员的世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员的世界!

pytest实现测试用例参数化的更多相关文章

  1. 教你如何用python开发一款数字推盘小游戏

    今年年初,新一季的《最强大脑》开播了,第一集选拔的时候大家做了一个数字游戏,名叫《数字华容道》,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个《数字华容道》的程序,过去了半年,我终于记起了这件事,今天就来实现。数字推盘游戏(n-puzzle)是一种智力游戏,常见的类型有十......

  2. Python基础篇

    一、准备工作1、安装Python(注意选择一个稳定的版本,方便学习和使用)Python官网:https://www.python.org/2、安装一个anacondaanaconda官网:https://www.anaconda.com/安装完成之后在cmd里面输入conda -V检测,如果出现版本......

  3. python函数指定默认值的实例

    1、说明(1)写函数时,可以为每个参数指定默认值。当调用函数为参数提供实际参数时,Python将使用指定的实际参数;否则,将使用参数的默认值。因此,给参数指定默认值后,可以在函数调用中省略相应的参数。(2)使用默认值可以简化函数调用,明确指出函数的典型用法。2、实例>>> def ......

  4. 执行py文件需要可执行权限吗?

    我们知道可执行权限x在Linux系统中的重要性,那么在执行py文件的过程中,是否一定需要可执行权限呢?本文将会详细的分析几种测试案例。案例解析这个问题描述起来有点违反直觉,要执行一个文件难道不应该需要可执行权限吗?让我们先来看一个例子:# module1.pydef test():print ('h......

  5. 正确的使用Python临时文件

    1、前言临时文件通常用来保存无法保存在内存中的数据,或者传递给必须从文件读取的外部程序。一般我们会在/tmp目录下生成唯一的文件名,但是安全的创建临时文件并不是那么简单,需要遵守许多规则。永远不要自己去尝试做这件事,而是要借助库函数实现。而且也要小心清理临时文件。临时文件引起的最大问题就是,可以预测......

  6. Python实现微信表情包炸群

    Python实现微信表情包炸群# -*- coding = utf-8 -*- # @Time : 2021/1/26 15:19 # @Author : 陈良兴# @File : 微信表情包炸群.py# @Software : PyCharm# 运行程序 > 输入次数 > 回车 >......

  7. 将不规则的Python多维数组拉平到一维的方法实现

    原始需求:例如有一个列表:l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]希望把它转换成下面这种形式:[1, 2, 3, 4, 5, 6, 7, 8, 9]其实这个非常简单,我将分享三个一行式代码来解决这个问题。但如果是下面这种不规则的多维列表:l = [[1, 2], [......

  8. python常用模块的常用方法介绍 os、math、random、time、datetime、国内常见镜像

    导入模块的一些语法from random import randint#2、from 模块名 import 函数名,导入模块里的一个方法或变量 from math import * #3、from 模块名 import * ,导入模块里的'所有'(并不是所有的都能导进来)方法和变量 import d......

  9. python用分数表示矩阵的方法实例

    前言在机器学习中,我们会经常和矩阵打交道。在矩阵的运算中,python默认的输出是浮点数,但是如果我们想要矩阵的元素以分数的形式显示,可以通过添加一行代码来实现。1、函数及参数解释set_printoptions()——控制输出方式formatter——通用格式化输出Fraction(x).limi......

  10. 复杂的数据类型

    目录一、列表 1.列表介绍 2.列表读取 读取单个元素 读取列表的一部分 3.列表的修改 4.其他常用操作列表的函数 二、字典 1.字典的介绍 2.字典的读取 3.字典的元素增减 一、列表1.列表介绍列表,数据类型为list,可以存储多个不同种类的元素,其中,字符串元素需要加引号,且元素间要用逗号隔......

随机推荐

  1. Vue 重置data的数据为初始状态操作

    在某些情况下,需要重新使用data中的数据,但是data中的数据已经被各种表单、变量等赋值,那么怎么重置data的值呢?1. 逐个赋值...data() {return {name: '',sex: '',desc: ''}}...// 逐个赋值this.name = ''this.sex = ''......

  2. asp判断某个文件是否存在的函数

    最近在写功能的时候需要判断某个文件是否存在,存在则调用,不存在则动态显示页面的功能,用到了下面的代码,特分享一下需要的朋友可以参考一下。两个函数都是基于ASP中的FileSystemObject对象,也就是FSO,写成函数方便以后使用。ASP检查目录是否存在的函数代码Function isExist......

  3. oracle 11g的安装注意事项总结

    oracle 11g 安装注意事项1、首先时这个配置安全更新页面,不需要填写电子邮件,下面安全更新也取消候选,否则一旦出现软件更新,会拖慢我们的使用进度2、在安装选项这里,就选择第一个“创建和配置数据库”,就是安装完整的oracle数据库软件第二个“仅安装数据库软件”,意思就是只安装实例,并不安装数......

  4. Python爬虫实现selenium处理iframe作用域问题

    项目场景:在使用selenium模块进行数据爬取时,通常会遇到爬取iframe中的内容。会因为定位的作用域问题爬取不到数据。问题描述:我们以菜鸟教程的运行实例为案例。按照正常的定位会以文本块生成xpath为/html/body/text()。这样的话根据xpath进行如下代码编写。#!/user/b......

  5. JS removeAttribute()方法实现删除元素的某个属性

    在 JavaScript 中,使用元素的 removeAttribute() 方法可以删除指定的属性。用法如下:removeAttribute(name)参数 name 表示元素的属性名。示例1下面示例演示了如何动态设置表格的边框。window.onload = function () { //绑定......

  6. Android实现计步器功能

    本文实例为大家分享了Android实现计步器功能的具体代码,供大家参考,具体内容如下计步器的原理是通过手机的前后摆动模拟步伐节奏检测。我们本身在手机的传感器中就有计步器的传感器,所以这里我们直接上代码。activity_main.xml<?xml version="1.0"......

  7. Java MyBatis limit分页设置

    错误的写法:<select id="queryMyApplicationRecord" parameterType="MyApplicationRequest" resultMap="myApplicationMap">SELE......

  8. 【Android初级】使用Gallery实现照片拖动的特效(附源码)

    今天要分享一个非常简单的功能:使用Android原生控件Gallery实现照片拖动的特效实现思路如下:在布局文件中定义一个Gallery控件由于要显示多张图,为了方便,我直接引用了Android原生的图片资源Gallery只是一个控件,为了将图片数据跟控件进行绑定,还需要一个继承BaseAdapte......

  9. JVM虚拟机Class类文件研究分析

    本文对java编译后的Class文件进行研究,依次介绍了Class文件中魔数、JDK版本号、常量池、访问标志、类索引、父类索引与接口索引集合、字段表、方法表、属性表等,最后简单介绍了Class文件阅读流程。前言为了研究Class文件,先编写一个最简单的代码:package com.courage;p......

  10. Python学习(7)(模块、pyc文件)

    Python学习(7)一、python的模块二、Pyc 文件一、python的模块模块是python程序架构的一个核心概念 模块就好比是工具包,要想使用这个工具包中的工具,就需要导入import这个模块每一个以扩展名py结尾的python源代码文件都是一个模块 在模块中定义的全局变量、函数都是模块能......