pytest用yaml文件编写测试用例流程详解
作者:爱学习de测试小白 发布时间:2022-04-19 03:55:29
前言
本篇来学习在pytest中使用yaml编写测试用例
项目结构
conftest.py
只需在 conftest.py 即可实现使用yaml编写测试用例
# -*- coding: utf-8 -*-
import jsonpath
import pytest
import requests
def pytest_collect_file(parent, file_path):
if file_path.suffix == ".yaml" and file_path.name.startswith("test"):
return YamlFile.from_parent(parent, path=file_path)
class YamlFile(pytest.File):
def collect(self):
import yaml
yml_raw = self.fspath.open(encoding='utf-8').read()
print('yml_raw', yml_raw)
yml_var = Template(yml_raw).safe_substitute(os.environ)
raw = yaml.safe_load(yml_var)
print('raw', raw)
for yaml_case in raw:
name = yaml_case["test"]["name"]
values = yaml_case["test"]
yield YamlItem.from_parent(self, name=name, spec=values)
class YamlItem(pytest.Item):
def __init__(self, name, parent, spec):
super().__init__(name, parent)
self.name = name
self.values = spec
self.request = self.values.get("request")
self.validate = self.values.get("validate")
self.s = requests.session()
def values_render_variable(self, values):
# 替换测试用例中的关联值
yaml_test = Template(json.dumps(values)).safe_substitute(os.environ)
values = yaml.safe_load(yaml_test)
print('values', values)
return values
def runtest(self):
values = self.values_render_variable(self.values)
print('values:', values)
request_data = values["request"]
response = self.s.request(**request_data)
print("响应数据:", response.text)
# 判断是否有extract提取参数,实现参数关联
if values.get("extract"):
for key, value in values.get("extract").items():
os.environ[key] = jsonpath.jsonpath(response.json(), value)[0]
print('key', key)
print('value', jsonpath.jsonpath(response.json(), value)[0])
# 断言
print('validate:', self.validate)
self.assert_response(response, self.validate)
def assert_response(self, response, validate):
"""自定义断言"""
for i in validate:
if "eq" in i.keys():
yaml_result = i.get("eq")[0]
actual_result = jsonpath.jsonpath(response.json(), yaml_result)
expect_result = i.get("eq")[1]
print("实际结果:%s" % actual_result[0])
print("期望结果:%s" % expect_result)
assert actual_result[0] == expect_result
yaml文件
test_method.yaml
说明:
此yaml支持参数化
extract :提取关键字
name: 后面引用变量的key值
$.args.name:jsonpath 提取变量表达式
引用变量
$name : $key
- test:
name: get case
request:
url: https://postman-echo.com/get
method: GET
headers:
Content-Type: application/json
User-Agent: python-requests/2.18.4
params:
name: DH
city: Beijing
extract:
name: $.args.name
validate:
- eq: [$.args.name, DH]
- eq: [$.args.city, Beijing]
- test:
name: post case
request:
url: https://postman-echo.com/post
method: POST
headers:
Content-Type: application/json
User-Agent: python-requests/2.18.4
json:
name: $name
city: Beijing
validate:
- eq: [$.json.name, DH]
- eq: [$.json.city, Beijing]
执行并查看结果
pytest -s -v
来源:https://blog.csdn.net/IT_heima/article/details/127297186
猜你喜欢
- AICodeHelper是一款AI编程助手,旨在帮助程序员提高他们的编码技能。简单的像尝试的代码直接问就行,但是一些复杂的,就得需要写技巧;
- 1、关于 StatsModelsstatsmodels(http://www.statsmodels.org)是一个Python库,用于拟合
- 简述写一个简单的flask文件下载接口。依赖flask、gevent代码不废话上代码。#!/usr/bin/env python3# -*-
- 另外,我们在 控制结构比较两个数值是否一直的时候,也应该尽量使用 === 来代替 ==(当然,这个也根据具体的业务逻辑选用比较合适的)。 小
- 这是为了实现一个效果,而提前作的测试代码!看起来很简单的一个东西,到这会,大约四个小时过去了。不知道是IE6的BUG;还是我自已的BUG!有
- 已解决卸载pip重新安装的方法问题需求粉丝群里面的一个小伙伴遇到问题跑来私信我,想用卸载pip重新安装pip,但是发生了报错(当时他心里瞬间
- 下面的request.servervariables例子都是服务器探针采用的asp代码本机ip:<%=request.serverva
- python正则表达式括号python中re库函数的简单用法re.findall(pattern,string)匹配所有符合正则表达式的字符
- 导语哈喽!我是木木子,又到了今日更新时刻!我们来看看写什么呢?小编有个好兄弟最近在追妹子,跟妹子打得火热!就差临门一脚了,这一jio我帮忙补
- 引言层次聚类是一种构建聚类层次结构的聚类算法。该算法从分配给它们自己的集群的所有数据点开始。然后将两个最近的集群合并到同一个集群中。最后,当
- 我查了资料:setRequestHeader,单独指定请求的某个http头语法oXMLHttpRequest.setRequestHeade
- 本段源码可以学习的地方:1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建;2. 可以重写一些魔术方法,比如 __new
- 1.安装anaconda(anaconda内置python在内的许多package,所以不用另外下载python)可以点击下面的清华开源软件
- 写在之前我们都知道 Python 中内置了许多标准的数据结构,比如列表,元组,字典等。与此同时标准库还提供了一些额外的数据结构,我们可以基于
- MapPathMapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上。语法Server.MapPath( Path ) 参
- 今天我们用python和pygame实现一个乒乓球的小游戏,或者叫弹珠球游戏。笑脸乒乓球游戏功能介绍乒乓球游戏功能如下:乒乓球从屏幕上方落下
- 本文实例为大家分享了python实现比较文件内容异同的具体代码,供大家参考,具体内容如下import sysimport difflibim
- ewebeditor支持兼容IE8 的方法方法:前几天ie8正式公布了,当天中午我就去下载了一个迫不急待的将自己的浏览器升级到ie8,偶还刻
- 在matplotlib下,一个Figure对象可以包含多个子图(Axes),可以使用subplot()快速绘制,其调用形式如下:subplo
- python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,th