Allure 是一个开源的测试工具,可以生成自动化测试报告,它支持的测试框架非常广泛,其中就包括 pytest。

生成支持 Allure 的测试结果数据


插件 allure-pytest,可以生成支持 Allure 的测试结果数据。

安装

pip install allure-pytest

使用

在 cases/test_a.py 中编写测试用例:


def test_case():
    assert True, "测试用例通过"
    
def test_case2():
    assert False, "测试用例失败"

执行 python run.py --alluredir=./allure-results --clean-alluredir ,运行测试用例,allure-pytest 插件会生成测试结果数据。

  • 参数 --alluredir=./allure-results: 会指定测试结果数据的存放目录为根目录 allure-result 目录(如果不存在,自动创建) 。

  • 参数 --clean-alluredir: 删除历史测试结果数据。

查看 项目根目录/allure-results 存放的测试结果数据

  • 现在可以看到 allure-result/ 目录下有一些 JOSN 文件,这些文件存放着测试用例的结果数据。不过现在的数据不直观,需要使用 Allure 生成直观的测试报告。或者自己解析生成更符合需求的测试报告文件。

上述参数可以在 pytest.toml 中声明,再执行 python run.py 会有一样的效果。

[pytest]
addopts = [
    "--alluredir", "allure-results",
    "--clean-alluredir"
]

安装 JDK


Allure 需要 JAVA 环境才可以使用,先安装一下 JDK。

Windows 平台安装

点击JDK下载地址,下载最新版本(.zip),说是最兼容的版本是 JDK11,如果最新版本有任何问题,可以换成 JDK11。

下载后,解压,再移动 jdk-XX.X.X 目录到指定的目录下,记住这个目录。

不要随意改动环境变量,否则可能造成系统死机。

JDK 需要配置环境变量,步骤如下:

配置JDK系统变量

  • 右键此电脑-属性-高级系统设置-环境变量

  • 系统变量-点击新建

  • 变量名:JAVA_HOME

  • 变量值:JDK 放置目录(比如:C:\tools\Java\jdk-24.0.1)

配置JDK的环境环境

  • 环境变量中找到Path,选中后点击编辑

  • 新建环境变量:%JAVA_HOME%\bin;

  • 一路确定

验证 JAVA 环境变量

  • win + r,输入 cmd

  • 命令行中执行:java -version

  • 输出类似 java version "24.0.1" 2025-04-15,说明配置成功

Ubunto 平台安装

输入 java -version,如果没有 JAVA 环境,会输出类似信息:

Command 'java' not found, but can be installed with:
sudo apt install openjdk-17-jre-headless  # version 17.0.17+10-1~24.04, or
sudo apt install openjdk-21-jre-headless  # version 21.0.9+10-1~24.04
sudo apt install default-jre              # version 2:1.17-75
sudo apt install openjdk-19-jre-headless  # version 19.0.2+7-4
sudo apt install openjdk-20-jre-headless  # version 20.0.2+9-1
sudo apt install openjdk-22-jre-headless  # version 22~22ea-1
sudo apt install openjdk-11-jre-headless  # version 11.0.29+7-1ubuntu1~24.04
sudo apt install openjdk-25-jre-headless  # version 25.0.1+8-1~24.04
sudo apt install openjdk-8-jre-headless   # version 8u472-ga-1~24.04

输出信息中给出了仓库中可供安装的 JDK 各版本信息,按需选择即可。

比如安装 openjdk-21-jre-headless(headless 版本移除了 Java 的图形界面相关组件(如 AWT/Swing),体积更小,完全适配终端环境下运行 Allure(Allure 生成报告是命令行 / HTML 形式,无需图形界面)):

sudo apt install openjdk-21-jre-headless

输入密码后,随即安装,安装过程中如果需要确认,输入 y 即可。

最后输入 java -version,确定是否安装成功。

部署 Allure


访问 Allure 下载最新包(zip或者tar.gz)。

Windows 平台安装

将压缩包解压到固定路径,记住这个目录。

不要随意改动环境变量,否则可能造成系统死机。

配置 ALLURE 系统变量

  • 右键此电脑-属性-高级系统设置-环境变量

  • 系统变量-点击新建

  • 变量名:ALLURE_HOME

  • 变量值:ALLURE 放置目录(比如:C:\tools\allure-2.36.0)

配置 ALLURE 的环境环境

  • 环境变量中找到 Path,选中后点击编辑

  • 新建环境变量:%ALLURE_HOME%\bin

  • 一路确定

验证 ALLURE 环境变量

  • win + r,输入 cmd

  • 命令行中执行:allure --version

  • 输出类似 2.24.1,说明配置成功

Ubunto 平台安装

# 将压缩包解压到用户目录 ~/ 下
unzip allure-2.24.1.zip -d ~/
# 配置环境变量(永久生效)
echo 'export ALLURE_HOME="$HOME/allure-2.24.1"' >> ~/.bashrc
echo 'export PATH="$ALLURE_HOME/bin:$PATH"' >> ~/.bashrc
# 刷新环境变量
source ~/.bashrc
# 给 allure 文件添加执行权限(关键!)
chmod +x ~/allure-2.24.1/bin/allure
# 顺带确保 bin 目录有执行权限(进入目录需要)
chmod 755 ~/allure-2.24.1/bin/

最后验证:

allure --version
# 输出 类似2.24.1

使用 Allure 生成测试报告并查看


生成测试报告

执行 allure generate allure-result --clean ,allure 包会根据测试结果数据生成测试报告,默认生成在当前目录下的 allure-report 目录

  • generate:是 Allure CLI 的一个子命令,表示生成报告。

  • allure-result:是输入源,即插件 allure-pytest 原始测试结果数据的目录。可以指定多个结果目录。

  • --clean:清空输出目录(allure-report)中的所有旧文件,再生成新报告。

  • 补充:参数 -o 可以指定生成报告的输出目录。

执行 allure open allure-report,针对已生成的静态报告目录启动轻量本地服务,通过浏览器访问查看测试报告。

Starting web server...
Can not open browser because this capability is not supported on your platform. You can use the link below to open the report manually.
Server started at <http://127.0.0.1:40497>. Press <Ctrl+C> to exit

生成的 allure-result 目录可以压缩打包后,分发给任何有 Allure 环境的任何人或任何机器,进行查看。或者自己本地运行后,开放 40497 端口,让目标人员通过浏览器访问查看。

启动文件中编辑自动生成测试报告

import logging
import sys
import argparse
import subprocess

from common.database import DatabaseConnectionPoolFactory
import pytest
from pytest import ExitCode  

# 自定义日志格式
LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s'
logging.basicConfig(level=logging.INFO, format=LOG_FORMAT)
logger = logging.getLogger(__name__)

# 运行测试
def run_tests(parser: argparse.ArgumentParser) -> int:
    """运行测试"""
    # 解析自定义参数和 pytest 参数
    customize_args, pytest_args = parser.parse_known_args()
    
    # 如果用户请求帮助,则打印帮助信息并退出
    if customize_args.help:
        parser.print_help()
        print("\n=== pytest 原生参数 help 信息 ===")
        pytest.main(["-h"])
        return 0  

    # 开始运行测试
    try:
        logger.info(f"开始运行测试,,pytest参数: {pytest_args}")
        exit_code = pytest.main(pytest_args)

        exit_code_value = exit_code.value if isinstance(exit_code, ExitCode) else exit_code
        exit_messages = {
            0: "✅ 全部测试用例通过",
            1: "⚠️ 部分测试用例未通过",
            2: "❌ 测试过程中有中断或其他非正常终止",
            3: "❌ 内部错误",
            4: "❌ 命令行参数错误",
            5: "❌ 没有收集到任何测试用例"
        }

        logger.info(exit_messages.get(exit_code_value, f"❓ 未知的退出码: {exit_code_value}"))
        return exit_code_value

    except Exception:
        logger.exception("运行测试时发生致命错误:")
        return 1

# 构建参数解析器,传递 pytest 参数,后续根据需求创建自定义参数
def parse_arguments() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(
        description="pytest 启动脚本(支持自定义参数 + pytest 参数)",
        add_help=False  # 隐藏默认帮助信息,避免与 pytest 的 -h 冲突
    )

    parser.add_argument(
        "-h", "--help",
        action="store_true",
        help="显示帮助信息(包含自定义参数和pytest原生参数)"
    )

    return parser
    

def generate_allure_report():
    try:
        # Windows 平台改为 subprocess.run(["allure.bat", "generate", "allure-results", "--clean"], check=True)
        subprocess.run(["allure", "generate", "allure-results", "--clean"], check=True)
        logger.info("已生成Allure报告")
    except subprocess.CalledProcessError as e:
        logger.error(f"生成Allure报告失败: {e}")

# 主函数
def main():
    mysql_connection = DatabaseConnectionPoolFactory.get_strategy(
        database_type="mysql", 
        database_configuration_name="mysql")
    logger.info("已创建MySQL数据库连接池")
    redis_connection = DatabaseConnectionPoolFactory.get_strategy(
        database_type="redis", 
        database_configuration_name="redis")
    logger.info("已创建Redis数据库连接池")
    parser = parse_arguments()
    exit_code = run_tests(parser)
    mysql_connection.close_pool()
    logger.info("已关闭MySQL数据库连接池")
    redis_connection.close_pool()
    logger.info("已关闭Redis数据库连接池")
    allure_report_path = generate_allure_report()
    logger.info(f"测试报告已压缩至 {allure_report_path}")
    sys.exit(exit_code)

if __name__ == "__main__":
    main()

THEEND



© 转载需要保留原始链接,未经明确许可,禁止商业使用。CC BY-NC-ND 4.0