Pytest-Bdd-Playwright 系列教程(5):仅执行测试用例的收集阶段

Pytest-Bdd-Playwright 系列教程(5):仅执行测试用例的收集阶段

  • 一、为什么需要仅收集测试用例
  • 二、应用场景
  • 三、方法详解
    • 【方法1】:添加pytest.ini文件的addopts配置项
    • 【方法2】:通过命令行参数运行
  • 四、CI/CD 环境下的实践
    • 4.1 使用 GitHub Actions 集成
  • 五、常见问题及解决方案
    • 5.1 收集失败:找不到测试用例
    • 5.2 路径配置冲突:模块导入失败
    • 5.3 自定义标记未被识别
    • 5.4 插件冲突
    • 5.5 测试用例参数化冲突
  • 总结

一、为什么需要仅收集测试用例

有的时候,我们可能只需要查看所有可用的测试用例,而不需要实际执行它们。

例如,在测试的过程中快速检查新添加的测试用例是否被正确识别,或者在持续集成(CI)环境中,我们可能希望快速检查测试套件的完整性。

--collect-only 是 pytest 的一个命令行参数,用于仅执行测试用例的收集阶段,而不运行任何测试,从而允许用户快速查看所有识别的测试用例列表。

二、应用场景

  1. 大型测试套件验证
  2. CI/CD 环境中的测试用例完整性检查
  3. 在代码重构后的测试用例重新识别

三、方法详解

【方法1】:添加pytest.ini文件的addopts配置项

pytest.ini文件中,找到[pytest]部分,并添加addopts配置项。设置addopts的值为--collect-only,如下所示:

ini 复制代码
[pytest]
addopts = --collect-only
  • addoptspytest 的一个配置项,用于添加默认的命令行选项。
  • --collect-onlypytest 的一个命令行参数,用于只收集测试用例而不执行它们。

【方法2】:通过命令行参数运行

我们可以直接运行pytest --collect-only命令,pytest 将会应用这个参数,并仅收集测试用例而不执行它们。

运行结果如下:

可以看到,我们之前写的3条测试用例。

四、CI/CD 环境下的实践

4.1 使用 GitHub Actions 集成

示例 YAML 配置文件如下:

yaml 复制代码
name: Pytest Collect Test Cases
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.11.9'
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
      - name: Collect test cases
        run: |
          pytest --collect-only

五、常见问题及解决方案

在使用 --collect-only 参数进行测试用例收集时,可能会遇到一些问题。以下是常见问题的说明及相应的解决方案。

5.1 收集失败:找不到测试用例

问题描述 :使用 --collect-only 后,pytest 显示没有找到测试用例,可能是因为测试用例未遵循 pytest 的命名规范。

解决方案

  • 确保测试文件和测试函数符合 pytest 的命名约定。例如,测试文件应以 test_ 开头或以 _test.py 结尾,测试函数应以 test_ 开头。
  • 检查 pytest 配置文件(如 pytest.initox.inisetup.cfg),确保未更改默认的测试发现规则。
ini 复制代码
# pytest.ini 示例
[pytest]
python_files = test_*.py *_test.py
python_functions = test_*

5.2 路径配置冲突:模块导入失败

问题描述 :当项目结构复杂时,pytest 可能无法正确导入模块,导致 --collect-only 收集失败或模块未找到。

解决方案

  • 确保项目根目录下有一个空的 __init__.py 文件,使其被识别为一个包。

  • 使用 PYTHONPATH 指定项目根目录,以确保 pytest 在正确路径下运行。例如,在命令行中设置路径:

    bash 复制代码
    PYTHONPATH=. pytest --collect-only
  • 也可以在 CI/CD 中使用 env 环境变量来指定 PYTHONPATH,确保 pytest 可以正确收集测试用例。

5.3 自定义标记未被识别

问题描述 :如果测试用例包含自定义标记,可能会遇到 --collect-only 收集失败或提示标记未定义的问题。

解决方案

  • pytest.ini 中添加 markers 配置,定义所有自定义标记。例如:

    ini 复制代码
    [pytest]
    markers =
        smoke
        slow
  • 添加标记后,重新运行 pytest --collect-only,确保 pytest 可以识别并收集带有自定义标记的测试用例。

5.4 插件冲突

问题描述 :某些 pytest 插件可能会与 --collect-only 参数发生冲突,导致收集失败或意外行为。

解决方案

  • 确认所有插件是否都兼容当前的 pytest 版本。可以通过以下命令检查已安装插件及其版本:

    bash 复制代码
    pytest --version
  • 尝试禁用插件,检查是否有冲突。例如,如果某插件导致冲突,可以暂时禁用该插件进行排查:

    bash 复制代码
    pytest --collect-only -p no:<plugin_name>
  • 更新或卸载冲突的插件,或者使用最新的 pytest 版本来避免兼容性问题。

5.5 测试用例参数化冲突

问题描述 :如果测试用例中使用了参数化功能,有时会因参数值配置不当而导致 --collect-only 收集出错。

解决方案

  • 检查参数化的值,确保所有参数组合都是有效的。例如,使用 pytest.mark.parametrize 时,确保参数列表和参数值数量一致。

  • 如果是复杂的参数组合,可以将参数化部分单独测试以排除问题来源:

    python 复制代码
    import pytest
    
    @pytest.mark.parametrize("input,expected", [
        (1, 2),
        (3, 4),
    ])
    def test_example(input, expected):
        assert input + 1 == expected

总结

通过 pytest 的 --collect-only 参数,我们可以让 pytest-bdd 仅收集测试用例而不执行它们。这种方法使得自动化测试框架在测试过程中更加灵活。无论是在测试过程中还是在CI环境中,这一配置都能帮助我们更好地管理和检查我们的测试套件。

相关推荐
天才测试猿1 天前
软件测试之功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
慌糖1 天前
[特殊字符]️ 基于Pytest的自动化测试框架架构解析
pytest
测试工程喵2 天前
如何高效定位Bug:测试工程师的问题诊断艺术
功能测试·测试用例·bug·模块测试·缺陷管理·bug定位
车载测试工程师2 天前
车载功能测试-车载域控/BCM控制器测试用例开发流程【用例导出方法+优先级划分原则】
功能测试·安全·车载系统·测试用例·测试覆盖率
旦莫2 天前
Pytest教程:为什么Pytest要用插件模式?
python·单元测试·自动化·pytest
程序员三藏2 天前
Python+Selenium的自动化测试框架详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
suimeng63 天前
Jenkins的地位和作用
自动化测试·jenkins
三次握手四次挥手3 天前
基于Python+Pytest实现自动化测试(全栈实战指南)
开发语言·python·自动化·k8s·apache·pytest·代码规范
世界的尽头在哪里4 天前
python测试框架之pytest
开发语言·python·测试工具·单元测试·pytest
小突突突4 天前
总结设计测试用例的万能公式
测试用例