当前位置: 首页 > news >正文

Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 优化场景定义

Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 & 优化场景定义

  • 前言
  • 一、功能文件路径的配置
    • 1.1 全局设置功能文件路径
    • 1.2. 在场景中覆盖路径
  • 二、避免重复输入功能文件名
    • 2.1 使用方法
    • 2.2 `functools.partial` 的背景
  • 三、应用场景总结

前言

  • 在实际应用的过程中,我们经常需要根据不同的测试需求来调整功能文件(.feature文件)的路径,以及优化测试场景的定义以减少重复代码;
  • 本文将详细介绍如何配置功能文件路径以及如何使用 functools.partial 方法来优化场景定义,帮助大家更高效地管理和执行 BDD 测试。

一、功能文件路径的配置

默认情况下,pytest-bdd 会将当前模块路径作为功能文件(feature file)的查找路径。但我们可以通过以下方式调整此行为:

1.1 全局设置功能文件路径

pytest 的配置文件中(如 pytest.initox.inisetup.cfg),使用 bdd_features_base_dir 键指定一个新的路径。例如:

# pytest.ini
[pytest]
bdd_features_base_dir = features/

这意味着,除非在单个场景中另有指定,否则所有的 BDD 特征文件(.feature 文件)都将从这个指定的路径下查找。在这个例子中,全局路径被设置为项目根目录下的features/路径

1.2. 在场景中覆盖路径

我们可以通过 @scenario 装饰器的 features_base_dir 参数为单个场景设置不同的路径。例如:

from pytest_bdd import scenario@scenario("foo.feature", "Foo 功能")
def test_foo():pass@scenario("demo.feature","Demo 功能",features_base_dir="./test/features/",
)
def test_foo_local():pass

这种方式允许在特定测试中灵活调整功能文件的路径。
第一个场景没有指定 features_base_dir 参数,因此它将使用全局设置的路径 features/;
第二个场景通过 @scenario 装饰器的 features_base_dir 参数指定了一个特定场景覆盖的路径:./test/features/,此时不会使用全局设置的路径。

二、避免重复输入功能文件名

当一个测试文件中包含多个场景时,重复输入相同的功能文件路径可能显得冗余且容易出错。为了解决这个问题,可以借助 Python 的 functools.partial 方法。

2.1 使用方法

test_search.py文件,通过 functools.partial 创建一个带有预设路径的 scenario 函数。例如:
在这里插入图片描述

import pytest
from steps.search_steps import *
from pytest_bdd import scenario
from functools import partialscene = partial(scenario, 'search.feature')@pytest.mark.smoke
@scene('成功搜索')
def test_successful_search():pass@pytest.mark.low
@scenario('search.feature', '失败搜索')
def test_failed_search():pass

上述代码的优势在于只需指定一次功能文件路径 /features/search.feature,即可简化后续的场景定义。

2.2 functools.partial 的背景

functools.partial 是 Python 标准库中的一个工具,允许创建一个新函数,该函数会固定原始函数的部分参数值。有关更多信息,请参考 Python 官方文档。


三、应用场景总结

  • 全局配置路径:适用于大部分功能文件都在同一目录下的项目。
  • 按场景配置路径:适合少量场景需要自定义路径的情况。
  • 使用 partial 优化:非常适合多个场景都依赖同一个功能文件的情况。
http://www.lryc.cn/news/487604.html

相关文章:

  • rust逆向初探
  • 【Linux】apt 关闭 ssl 认证
  • 【算法】P5018 对称二叉树
  • Unifying Top-down and Bottom-up Scanpath Prediction Using Transformers
  • JavaSE(十四)——文件操作和IO
  • 【视觉SLAM】4b-特征点法估计相机运动之PnP 3D-2D
  • android 性能分析工具(04)Asan 内存检测工具
  • html中select标签的选项携带多个值
  • Lambda表达式如何进行调试
  • C++ —— 剑斩旧我 破茧成蝶—C++11
  • HTML5好看的音乐播放器多种风格(附源码)
  • C++设计模式行为模式———迭代器模式中介者模式
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十五,解码相关,将h264文件进行帧分隔变成avpacket
  • 力扣 LeetCode 104. 二叉树的最大深度(Day7:二叉树)
  • 如何高效实现汤臣倍健营销云数据集成到SQLServer
  • Vue3中使用:deep修改element-plus的样式无效怎么办?
  • 具身智能之Isaac Gym使用
  • 【大数据学习 | Spark】spark-shell开发
  • 《Python制作动态爱心粒子特效》
  • Jmeter 如何导入证书并调用https请求
  • Python程序15个提速优化方法
  • 足球虚拟越位线技术FIFA OT(二)
  • centos7.9单机版安装K8s
  • 图像编辑一些概念:Image Reconstruction与Image Re-generation
  • 【STM32】在 STM32 USB 设备库添加新的设备类
  • 【Redis】Redis实现的消息队列
  • # Spring事务
  • Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找
  • ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
  • 7.STM32之通信接口《精讲》之USART通信---多字节数据收发(数据包的模式:HEX数据包和文本数据包)