玩命加载中 . . .

借助pytest hook生成Allure所需的environment.properties文件内容,第二版


概述

为了在使用pytest时自动生成一个包含环境和版本信息的environment.properties文件,你可以使用pytest的钩子函数来在测试会话开始时记录起始时间,以及在测试会话结束时记录终止时间,并计算耗时。然后根据这些信息生成文件。

pytest hook方案

上一版是在conftest.py中借助 pytest_sessionstartpytest_sessionfinish, 本次使用pytest_configure,pytest_sessionfinishpytest_runtest_logreport三个hook实现。

不废言,直接上代码:

# Content of conftest.py
import os
import pytest
from datetime import datetime
from zoneinfo import ZoneInfo

from utils.config import CONFIG

# 测试环境信息,根据你的实际情况进行修改
BASE_URL = CONFIG['orangehrm_base_url']
TEST_ENVIRONMENT_IP = BASE_URL.split('/')[1:][1]    # 被测环境的IP
PRODUCT_VERSION = BASE_URL.split('/')[1:][2]        # 被测产品的版本

# 初始化统计信息
test_stats = {'passed': 0, 'failed': 0, 'skipped': 0, 'total': 0, 'errors': 0, 'broken': 0}

@pytest.hookimpl(tryfirst=True)
def pytest_runtest_logreport(report):
    """
    pytest统计每个测试阶段(setup/call/teardown)的执行结果。
    """
    if report.when == 'call':  # 'call' 阶段代表测试用例的执行阶段
        test_stats['total'] += 1
        if report.passed:
            test_stats['passed'] += 1
        elif report.failed:
            if report.when == "call":
                test_stats['failed'] += 1
        elif report.skipped:
            test_stats['skipped'] += 1
        elif report.broken:
            test_stats['broken'] += 1

def pytest_sessionfinish(session, exitstatus):
    """
    测试会话结束时的操作,主要用于统计完成的测试结果信息。
    """
    tz = ZoneInfo("Asia/Shanghai")
    start_time = session.config.start_time # 测试开始时间
    end_time = datetime.now(tz=tz) # 测试结束时间
    duration = end_time - start_time

    # 获取已声明的alluredir命令行参数值
    allure_dir = session.config.getoption('--alluredir')
    if not allure_dir:
        print('Allure results directory not found. Ensure you are using "--alluredir" option with pytest.')
        return


    env_data = {
        'Environment IP': TEST_ENVIRONMENT_IP,
        'Product Version': PRODUCT_VERSION,
        'Test Start Time': start_time.strftime("%Y-%m-%d %H:%M:%S"),
        'Test End Time': end_time.strftime("%Y-%m-%d %H:%M:%S"),
        'Test Duration (seconds)': str(duration.total_seconds()),
        'Total Cases': str(test_stats['total']),
        'Passed Cases': str(test_stats['passed']),
        'Failed Cases': str(test_stats['failed']),
        'Skipped Cases': str(test_stats['skipped']),
        'Brokend Cases': str(test_stats['broken']),
    }

    # 写入环境信息
    if allure_dir:
        with open(os.path.join(allure_dir, 'environment.properties'), 'w') as env_file:
            for key, value in env_data.items():
                env_file.write(f'{key}={value}\n')

# 在配置中添加开始时间
def pytest_configure(config):
    tz = ZoneInfo("Asia/Shanghai")
    config.start_time = datetime.now(tz=tz)

生成的environment.properties文件内容参考如下:

Environment IP=192.168.23.130
Product Version=orangehrm-5.6
Test Start Time=2024-08-03 22:54:16
Test End Time=2024-08-03 22:54:17
Test Duration (seconds)=1.165052
Total Cases=9
Passed Cases=9
Failed Cases=0
Skipped Cases=0
Brokend Cases=0

文章作者: Gavin Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gavin Wang !
  目录