pytestx重新定义接口框架设计

这篇具有很好参考价值的文章主要介绍了pytestx重新定义接口框架设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概览

脚手架:

pytestx重新定义接口框架设计

目录:

pytestx重新定义接口框架设计

用例代码:

"""
测试登录到下单流程,需要先启动后端服务
"""

test_data = {
    "查询SKU": {
        "skuName": "电子书"
    },
    "添加购物车": {
        "skuId": 123,
        "skuNum": 2
    },
    "下单": {
        "orderId": 222,
        "payAmount": "0.2"
    },
    "支付": {
        "skuId": 123,
        "price": 0.1,
        "skuNum": 2,
        "totalPrice": 0.2
    },
}
case_vars = dict()


def test(http, login_headers, file_data):
    # 搜索商品
    url = file_data["domain"] + "/api/tasks/mock/searchSku"
    body = test_data["查询SKU"]

    response = http("get", url=url, headers=login_headers, params=body)
    assert response.status_code < 400

    case_vars["skuId"] = response.jsonpath("$.skuId")
    case_vars["skuPrice"] = response.jsonpath("$.price")

    # 添加购物车
    url = file_data["domain"] + "/api/tasks/mock/addCart"
    body = test_data["添加购物车"]
    body["skuId"] = case_vars["skuId"]

    response = http("post", url=url, headers=login_headers, json=body)
    assert response.status_code < 400

    case_vars["skuNum"] = response.jsonpath("$.skuNum")
    case_vars["totalPrice"] = response.jsonpath("$.totalPrice")

    # 下单
    url = file_data["domain"] + "/api/tasks/mock/order"
    body = test_data["下单"]
    body["skuId"] = case_vars["skuId"]
    body["price"] = case_vars["skuPrice"]
    body["skuNum"] = case_vars["skuNum"]
    body["totalPrice"] = case_vars["totalPrice"]

    response = http("post", url=url, headers=login_headers, json=body)
    assert response.status_code < 400

    case_vars["orderId"] = response.jsonpath("$.orderId")

    # 支付
    url = file_data["domain"] + "/api/tasks/mock/pay"
    body = test_data["支付"]
    body["orderId"] = case_vars["orderId"]

    response = http("post", url=url, headers=login_headers, json=body)
    assert response.status_code < 400
    assert response.jsonpath("$.success") == "true"

页面下载脚手架

启动平台前后端服务后,从页面下载脚手架,平台会拉取开源项目tep-project最新代码,打成压缩包,生成下载文件,弹窗下载。

备注:tep startproject demo使用的已封版的1.0.0版本,新框架请访问开源项目tep-project,或者开源平台pytestx

精简目录

目录直观上非常精简,得益于去掉了环境变量、函数等目录,聚焦三大目录:

  • fixtures

  • resources

  • tests

重度使用fixture

fixture原本只能在conftest定义,借助pytest插件扩展识别fixtures目录:

#!/usr/bin/python
# encoding=utf-8

"""
@Author  :  dongfanger
@Date    :  8/14/2020 9:16 AM
@Desc    :  插件
"""
import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
RESOURCE_PATH = os.path.join(BASE_DIR, "resources")


def fixture_paths():
    """
    fixture路径,1、项目下的fixtures;2、tep下的fixture;
    :return:
    """
    _fixtures_dir = os.path.join(BASE_DIR, "fixtures")
    paths = []
    # 项目下的fixtures
    for root, _, files in os.walk(_fixtures_dir):
        for file in files:
            if file.startswith("fixture_") and file.endswith(".py"):
                full_path = os.path.join(root, file)
                import_path = full_path.replace(_fixtures_dir, "").replace("\\", ".")
                import_path = import_path.replace("/", ".").replace(".py", "")
                paths.append("fixtures" + import_path)
    return paths


pytest_plugins = fixture_paths()  # +[其他插件]

conftest.py的fixture全部转移至fixtures目录定义。

公共函数消失,统统通过fixture来实现,依赖注入。

包括requests.request封装

#!/usr/bin/python
# encoding=utf-8

import decimal
import json
import time

import jsonpath
import pytest
import requests
import urllib3
from loguru import logger
from requests import Response

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class TepResponse(Response):
    """
    二次封装requests.Response,添加额外方法
    """

    def __init__(self, response):
        super().__init__()
        for k, v in response.__dict__.items():
            self.__dict__[k] = v

    def jsonpath(self, expr):
        """
        此处强制取第一个值,便于简单取值
        如果复杂取值,建议直接jsonpath原生用法
        """
        return jsonpath.jsonpath(self.json(), expr)[0]


@pytest.fixture(scope="session")
def http():
    def inner(method, url, **kwargs):
        template = """\n
    Request URL: {}
    Request Method: {}
    Request Headers: {}
    Request Payload: {}
    Status Code: {}
    Response: {}
    Elapsed: {}
    """
        start = time.process_time()
        response = requests.request(method, url, **kwargs)  # requests.request原生用法
        end = time.process_time()
        elapsed = str(decimal.Decimal("%.3f" % float(end - start))) + "s"
        headers = kwargs.get("headers", {})
        kwargs.pop("headers")
        payload = kwargs
        log = template.format(url, method, json.dumps(headers), json.dumps(payload), response.status_code,
                              response.text,
                              elapsed)
        logger.info(log)
        return TepResponse(response)

    return inner

只是名字换成了http:

http("post", url=url, headers=login_headers, json=body)

因为request是fixture保留关键字。

数据分离

数据支持从文件读取,当然这也是一个fixture:

import json
import os

import pytest
import yaml

from conftest import RESOURCE_PATH


class Resource:
    def __init__(self, path):
        self.path = path

    def get_data(self):
        file_type = self._get_file_type()
        if file_type in [".yml", ".yaml", ".YML", "YAML"]:
            return self._get_yaml_file_data()
        if file_type in [".json", ".JSON"]:
            return self._get_json_file_data()

    def _get_file_type(self):
        return os.path.splitext(self.path)[-1]

    def _get_yaml_file_data(self):
        with open(self.path, encoding="utf8") as f:
            return yaml.load(f.read(), Loader=yaml.FullLoader)

    def _get_json_file_data(self):
        with open(self.path, encoding="utf8") as f:
            return json.load(f)


@pytest.fixture(scope="session")
def file_data():
    file_path = os.path.join(RESOURCE_PATH, "demo.yaml")
    return Resource(file_path).get_data()

也可以放在用例文件中。为什么?“只改数据不动用例代码”,如果没有这种情况,请毫不犹豫将数据放到用例文件中,不要从excel、yaml读取数据,增加无意义的中间转换。从流量回放替代自动化的趋势来看,数据和用例作为整体来维护和运行,会越来越普遍。在使用低代码平台时,测试数据也是写在用例里面,只有少量的公共信息,会抽出来作为变量。测试技术在发展,只有符合当前实际使用需要的,才是最好的。

用例设计

约定大于配置:

  • 数据区域、用例区域分离

  • 用例由步骤组成

  • 步骤分为前置条件、用例体、断言、数据提取

数据区域,接口入参、用例中间变量等:

test_data = {
    "查询SKU": {
        "skuName": "电子书"
    },
    "添加购物车": {
        "skuId": 123,
        "skuNum": 2
    },
    "下单": {
        "orderId": 222,
        "payAmount": "0.2"
    },
    "支付": {
        "skuId": 123,
        "price": 0.1,
        "skuNum": 2,
        "totalPrice": 0.2
    },
}
case_vars = dict()

用例定义,test函数,fixture引用:

def test(http, login_headers, file_data):

步骤:

# 搜索商品
url = file_data["domain"] + "/api/tasks/mock/searchSku"
body = test_data["查询SKU"]

response = http("get", url=url, headers=login_headers, params=body)
assert response.status_code < 400

case_vars["skuId"] = response.jsonpath("$.skuId")
case_vars["skuPrice"] = response.jsonpath("$.price")

每个用例文件单独可运行。不存在用例依赖,复用步骤封装为fixture,以依赖注入方式在各用例中复用。用例一定要解耦,这在任务调度时非常重要。

pytestx重新定义接口框架设计

总结,重新定义目录,重新定义用例组织,重新定义fixture,减少过程代码,专注于用例编写,轻松上手pytest。

跟着pytestx学习接口自动化框架设计,更简单,更稳定,更高效。

https://github.com/dongfanger/pytestx

https://gitee.com/dongfanger/tep-project文章来源地址https://www.toymoban.com/news/detail-670807.html

到了这里,关于pytestx重新定义接口框架设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云计算虚拟机管理平台建设: 模块设计, 接口定义, 测试方案设计, 集成发布流程

    作者:禅与计算机程序设计艺术 云计算是指利用互联网将各种资源通过网络进行计算、存储和传输,并借此实现资源共享、弹性伸缩、按需付费等服务特征的一种新的计算模式。云计算平台的建立可以提供高效、可靠的计算服务,并降低IT支出。在这个行业里,虚拟化就是云

    2024年02月07日
    浏览(40)
  • 如何基于YAML设计接口自动化测试框架?看完秒会

    在设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML、CSV)或者数据库中,实现脚本与数据解耦,方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测试用例,通过脚本读取出来驱动自动化测试代码执行。 至于采

    2023年04月24日
    浏览(52)
  • pytestx容器化执行引擎

    前端、后端、pytest均以 Docker 容器运行服务,单独的容器化执行引擎,项目环境隔离,即用即取,用完即齐,简单,高效。 前端容器:页面交互,请求后端,展示HTML报告 后端容器:接收前端请求,启动任务,构建镜像,触发运行pytest,挂载HTML报告 pytest容器:拉取项目代码,

    2024年02月10日
    浏览(60)
  • JAVA基于百度AI接口的人脸识别考勤签到系统设计与实现(Springboot框架)

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年02月04日
    浏览(57)
  • msata、mini pcie 、pcie x4接口引脚定义及原理图方案设计

    下图只用了2Lanes,pcie接口分x1、x4、x8、x16接口,向下兼容。含一对差分CLK时钟信号 原理图参考:《RK_EVB1_RK3568》含原理图和PCB 上图:pcie x4引脚定义 mini pcie 和msata的相同点:接口定义是一样的,接口可以相互交换使用。 不同点是: mini pcie 有1对Tx和1对Rx,和差分CLK时钟信号。

    2024年01月21日
    浏览(51)
  • 【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

    掌握 抽象类和接口的定义、使用、区别、常见设计模式; 抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要覆写的方法,这样相当于在语法程度上对子类进行了严格的定义限制,代码的开发也就更加标准。下面具体介绍抽象类的概念。 普通类可以直

    2024年02月16日
    浏览(48)
  • Jenkins 重新定义 pom 内容,打包

    添加仓库地址,拉取凭证,选择需要的分支 勾选 构建环境 下删除原始 build 配置,防止文件错误 Pre Steps 构建前处理 pom.xml ,例如我是需要删除该模块的所有子模块配置,我这里使用 shell 命令匹配所有 moudle 进行删除,就完成了修改

    2024年02月08日
    浏览(36)
  • 使用 Copilot 重新定义Forms表单创建

    您好,Microsoft 365 copilot订阅用户!很高兴与大家分享,您现在可以在表单中利用 Copilot 更轻松地构建高质量且设计精良的调查、表单和民意调查。 使用 Copilot 重新定义表单创建 只需向 Copilot 描述您想要构建的表单,您就可以加快创建过程并提高您的生产力! 运作方式 在“使

    2024年04月13日
    浏览(29)
  • 用户体验革命:Facebook如何重新定义社交交互

    在数字化的时代,社交媒体不仅仅是连接人与人之间的桥梁,更是用户体验不断演进的舞台。Facebook,作为全球最大的社交媒体平台之一,一直在努力通过创新和技术提升,重新定义社交交互,为用户带来更加丰富、便捷、个性化的社交体验。本文将深入探讨Facebook如何引领用

    2024年01月23日
    浏览(74)
  • Pixels:重新定义游戏体验的区块链农场游戏

    数据源:Pixels Dashboard 作者:lesley@footprint.network  最近,Pixels 通过从 Polygon 转移到 Sky Mavis 旗下的 Ronin 网络,完成了一次战略性的转变。 Pixels 每日交易量 Pixels 在 Ronin 网络上的受欢迎程度急剧上升,每月链上交易量超过 150 万次。如此高的活跃度展现出了其巨大的发展潜力。

    2024年01月18日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包