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

时间:2024-10-31 09:29:37

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,如下所示:

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

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

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

运行结果如下:
在这里插入图片描述
可以看到,我们之前写的3条测试用例。

四、CI/CD 环境下的实践

4.1 使用 GitHub Actions 集成

示例 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),确保未更改默认的测试发现规则。
# pytest.ini 示例
[pytest]
python_files = test_*.py *_test.py
python_functions = test_*

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

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

解决方案

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

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

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

5.3 自定义标记未被识别

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

解决方案

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

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

5.4 插件冲突

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

解决方案

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

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

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

5.5 测试用例参数化冲突

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

解决方案

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

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

    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环境中,这一配置都能帮助我们更好地管理和检查我们的测试套件。