进阶用法

并发测试和分布式测试

在日常的接口自动化测试过程中,需要并发执行测试用例,以提高测试效率。

有时候也需要引入分布式测试,以便在多台机器上同时运行测试用例,也能更好的提升测试效率。

pytest-xdist 是 Pytest 的一个插件,能提供了一些对应的功能,主要用于支持并发测试和分布式测试。

pytest-xdist 功能介绍

  1. 并发执行测试

    • 使用 -n 选项:pytest -n NUM 允许并发运行测试,其中 NUM 是并发 worker 的数量。这可以加速测试执行,特别是在拥有多个 CPU 内核的计算机上。
    pytest -n 3  # 启动 3 个并发 worker 执行测试
    
  2. 分布式测试

    • 使用 pytest --dist=loadscope:允许在多个节点上执行测试,通过分布式测试可以更快地完成测试运行。
    pytest --dist=loadscope
    
    • 使用 pytest --dist=each:每个节点运行一组测试,适用于分布式测试。
    pytest --dist=each
    
  3. 参数化测试和并发

    • 使用 pytest.mark.run:结合 pytest.mark.run 标记,可以选择在不同的进程或节点上运行具有不同标记的测试。
    @pytest.mark.run(processes=2)
    def test_example():
        pass
    
  4. 分布式环境设置

    • 使用 pytest_configure_node:可以在节点上运行测试之前进行配置。
    def pytest_configure_node(node):
        node.slaveinput['my_option'] = 'some value'
    
    • 使用 pytest_configure_node:可以在节点上运行测试之前进行配置。
    def pytest_configure_node(node):
        node.slaveinput['my_option'] = 'some value'
    
  5. 分布式测试环境销毁

    • 使用 pytest_configure_node:可以在节点上运行测试之后进行清理。
    def pytest_configure_node(node):
        # 配置节点
        yield
    
        # 在节点上运行测试后执行清理
        print("Cleaning up after test run on node %s" % node.gateway.id)
    

这些是 pytest-xdist 提供的一些功能,可以帮助您更有效地执行并发测试和分布式测试,以加速测试执行并提高效率。确保在使用前查阅 pytest-xdist 的文档以获取更详细的信息和用法示例。

安装 pytest-xdist 依赖

pip install pytest-xdist

并发运行测试用例示例

并发 3 个 worker 执行测试用例

分别运行以下命令,查看测试用例的执行时长

  • 并发执行
pytest -n 3

LKHRct

  • 默认串行执行
pytest

5y442s

串行执行耗时 9.81s,而并发执行耗时 1.63s,可以看到并发执行测试用例可以大大提高测试效率。

并发 3 个 worker 执行测试用例,并且每个 worker 都会打印测试用例的进度
pytest -n 3 -v

5krJia

测试结果中会打印测试进度,可以更好的了解测试用例的执行情况。

分布式测试示例

分布式测试,每个节点运行一组测试
pytest --dist=each

W1akqS

分布式测试可以更快地完成测试运行。

分布式测试,每个节点运行一组测试,并且每个 worker 都会打印测试用例的进度
pytest --dist=each -v

sMlawH

测试结果中会打印测试进度,可以更好的了解测试用例的执行情况。

分布式测试,每个节点运行一组测试,并且每个 worker 都会打印测试用例的进度,同时打印测试日志的输出
pytest --dist=each -v --capture=no

RkNSDb

测试结果中会打印测试日志的输出,可以更好的了解测试用例的执行情况。

筛选用例执行

在日常的接口测试过程中,我们需要根据实际情况来选择性地执行测试用例,以提高测试效率。

一般我们使用 allure 测试报告的时候,可以使用 Allure 标签特性来进行筛选对应标签的的用例来执行测试,但 Pytest 框架不直接支持运行基于 Allure 标签的测试。所以可以使用 Pytest 标记来实现这一点。

Pytest 提供 marks标记功能可以用来标记不同类型的测试用例,然后进行筛选对应类型的测试用例进行执行。

大致流程为你可以用自定义标记(如 Regression/Smoke)来标记测试,然后使用 pytest 的 -m 选项只运行这些测试。

定义 Pytest 标记

编辑 pytest.ini 文件,添加以下内容:自定义标记的类型

  • Regression:标记为回归测试的用例
  • Smoke:标记为冒烟测试的用例
markers =
    Regression: marks tests as Regression
    Smoke: marks tests as Smoke

标记用例

操作步骤为:

  • 引入 pytest
  • 使用 @pytest.mark 标记测试用例

为做区分,这里新建测试用例文件,文件名为 test_demo_filter.py

import pytest
import requests
import json


class TestPytestMultiEnvDemo:

    @pytest.mark.Regression  # mark the test case as regression
    def test_get_demo_filter(self, env_config, env_request_data, env_response_data):
        host = env_config["host"]
        get_api = env_config["getAPI"]
        get_api_response_data = env_response_data["getAPI"]
        # send request
        response = requests.get(host+get_api)
        # assert
        assert response.status_code == 200
        assert response.json() == get_api_response_data

    @pytest.mark.Smoke  # mark the test case as smoke
    def test_post_demo_filter(self, env_config, env_request_data, env_response_data):
        host = env_config["host"]
        post_api = env_config["postAPI"]
        post_api_request_data = env_request_data["postAPI"]
        print("make the request")
        post_api_response_data = env_response_data["postAPI"]
        # Your test code here
        response = requests.post(host + post_api, json=post_api_request_data)
        print("verify the response status code")
        assert response.status_code == 201
        print("verify the response data")
        assert response.json() == post_api_response_data

筛选测试用例执行

  • 运行 Regression 标记的测试用例
pytest -m Regression

这条命令告诉 pytest 只运行标有 Regression 的测试。

d8dMGa

  • 运行 Smoke 标记的测试用例
pytest -m Smoke

这条命令告诉 pytest 只运行标有 Smoke 的测试。

2023112014VOVT3v

参考资料


欢迎关注软件测试同学的公众号“软件测试同学”,原创 QA 技术文章第一时间推送。