如何通过pytest-repeat捕获所有KPI测试结果并计算平均值
解决方案
可以通过以下两种方式捕获每次测试的KPI结果并计算平均值:
方法1:使用模块级变量存储结果
定义一个模块级列表保存所有KPI值,在重复执行的测试中添加结果,最后单独计算平均值:
import pytest import logging import time # 模块级列表,存储所有KPI测试结果 kpi_results = [] @pytest.mark.repeat(10) # 修改为10次重复执行 def test_hdmi(request): global kpi_results rdk_ir.send('input') kpi = pytest.gpio.count_kpi(0, rdk_lux.get_note('pure_white_50_40')[test_inch]) logging.info(f'kpi {kpi} seconds') # 将本次测试结果加入列表 kpi_results.append(kpi) time.sleep(1) def test_calculate_kpi_average(): global kpi_results # 验证是否收集到10次结果 assert len(kpi_results) == 10, f"仅收集到{len(kpi_results)}次KPI结果,预期10次" # 计算平均值 average_kpi = sum(kpi_results) / len(kpi_results) logging.info(f'10次KPI测试平均值: {average_kpi:.2f} seconds') # 可选:添加业务断言,比如验证平均值是否符合要求 # assert average_kpi <= 3.0, f"KPI平均值{average_kpi:.2f}超过阈值3.0" # 清空列表,避免影响后续测试 kpi_results.clear()
方法2:使用pytest Fixture管理结果(推荐)
用module作用域的fixture存储结果,更符合pytest的设计风格,无需全局变量:
import pytest import logging import time @pytest.fixture(scope="module") def kpi_storage(): # 返回一个空列表,用于存储所有KPI结果 return [] @pytest.mark.repeat(10) def test_hdmi(request, kpi_storage): rdk_ir.send('input') kpi = pytest.gpio.count_kpi(0, rdk_lux.get_note('pure_white_50_40')[test_inch]) logging.info(f'kpi {kpi} seconds') # 将结果存入fixture维护的列表 kpi_storage.append(kpi) time.sleep(1) def test_calculate_kpi_average(kpi_storage): assert len(kpi_storage) == 10, f"仅收集到{len(kpi_storage)}次KPI结果,预期10次" average_kpi = sum(kpi_storage) / len(kpi_storage) logging.info(f'10次KPI测试平均值: {average_kpi:.2f} seconds') # 可选:业务断言 # assert average_kpi <= 3.0, f"KPI平均值不达标,当前值{average_kpi:.2f}"
注意事项
- 确保
@pytest.mark.repeat的参数设置为10,替换原代码中的2。 - 计算平均值的测试函数需定义在重复测试函数之后,pytest会按函数定义顺序执行,确保所有重复测试完成后再计算平均值。
- 如果某次测试失败导致结果未收集,断言会触发报错,便于及时定位问题。
内容的提问来源于stack exchange,提问作者赵小甲
相关产品推荐
相关产品推荐

