| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 21 天前 |
测试工程领域 Action 插件
运行于 GitCode Actions的测试工程领域插件集合,覆盖 pytest 用例元数据收集、结果上传、用例执行调度与结果汇总展示。
uses路径格式为openlibing/test-action/<插件目录>@<tag>,下文示例统一使用@v1.0.0,请按最新的标签替换。
插件一览
| 插件 | 作用 |
|---|---|
| openlibing-metadata-collect | 收集 pytest 用例元数据,生成 XML 报告 |
| openlibing-upload-reports | 将元数据/结果文件上传至 OpenLibing OBS |
| pytest-orch | 带环境调度的 pytest 用例执行器 |
| test-result-display | 从结果 JSON 生成 Markdown 汇总并写入步骤摘要 |
典型串联示例
元数据收集与上传
steps:
# 收集用例元数据
- name: Collect metadata
id: collect
uses: openlibing/test-action/openlibing-metadata-collect@v1.0.0
with:
testcase-path: tests
# 上传元数据
- name: Upload metadata
uses: openlibing/test-action/openlibing-upload-reports@v1.0.0
with:
files: ${{ steps.collect.outputs.metadata-output-path }}
openlibing-secret: ${{ secrets.OPENLIBING_SECRET }}
label: smoke
用例执行与结果展示
steps:
# 调度执行用例
- name: Run tests
id: orch
uses: openlibing/test-action/pytest-orch@v1.0.0
with:
git-username: ${{ secrets.GIT_USERNAME }}
git-password: ${{ secrets.GIT_PASSWORD }}
scheduler-secret: ${{ secrets.SCHEDULER_SECRET }}
obs-ak: ${{ secrets.OBS_AK }}
obs-sk: ${{ secrets.OBS_SK }}
obs-bucket-name: ${{ secrets.OBS_BUCKET }}
obs-server: ${{ secrets.OBS_SERVER }}
obs-base-url: ${{ secrets.OBS_BASE_URL }}
testcase-repo: my-org/my-tests
# 汇总展示结果
- name: Display results
uses: openlibing/test-action/test-result-display@v1.0.0
with:
json-file: ${{ steps.orch.outputs.testcase-file }}
openlibing-metadata-collect
收集 pytest 测试用例元数据并生成 XML 报告。插件会在随机临时目录创建 Python 虚拟环境,从 GitCode release 下载 pytest-testcase-collector wheel 并安装,随后执行 pytest --collect-only --metadata-output <file> 产出元数据 XML,执行结束后清理临时环境。
收集 metadata 信息示例 workflow
输入参数
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
testcase-path |
否 | '' |
测试用例目录路径。当指定 pytest-config-file 且由其 testpaths 决定收集范围时可省略 |
metadata-output-path |
否 | metadata_test.xml |
XML 输出文件路径,文件名必须以 metadata 开头;并发场景下请指定不同路径以避免覆盖 |
pytest-config-file |
否 | - | pytest 配置文件路径(如 pytest.ini),指定后由配置中的 testpaths 自动收集 |
rootdir |
否 | '' |
pytest rootdir 覆盖路径,作为 testpaths 与相对路径的解析基准 |
输出参数
| 参数 | 说明 |
|---|---|
metadata-output-path |
生成的 XML 文件绝对路径 |
使用约束
testcase-path与pytest-config-file至少指定其一,否则执行失败。- 输出文件名必须以
metadata开头(由validateOutputPath校验)。 - 所有路径须位于工作区内,禁止路径遍历(
..)与符号链接逃逸。 - 镜像源可通过环境变量
PYPI_INDEX_URL覆盖:必须 HTTPS,且主机须在白名单内:pypi.org、files.pythonhosted.org、mirrors.huaweicloud.com、mirrors.aliyun.com、pypi.tuna.tsinghua.edu.cn、mirrors.cloud.tencent.com。
使用示例
指定用例目录:
- name: Collect metadata
id: collect
uses: openlibing/test-action/openlibing-metadata-collect@v1.0.0
with:
testcase-path: tests
metadata-output-path: metadata_test.xml
使用 pytest 配置文件(由其 testpaths 决定收集范围):
- uses: openlibing/test-action/openlibing-metadata-collect@v1.0.0
with:
pytest-config-file: pytest.ini
收集后上传至 OpenLibing OBS(与 openlibing-upload-reports 串联):
steps:
- name: Collect metadata
id: collect
uses: openlibing/test-action/openlibing-metadata-collect@v1.0.0
with:
testcase-path: tests
- name: Upload metadata
uses: openlibing/test-action/openlibing-upload-reports@v1.0.0
with:
files: ${{ steps.collect.outputs.metadata-output-path }}
openlibing-secret: ${{ secrets.OPENLIBING_SECRET }}
label: smoke
openlibing-upload-reports
将测试元数据/结果文件上传至 OpenLibing OBS bucket。支持两种归档模式:流水线模式(pipeline-id / pipeline-run-id / job-id)与标签模式(label + 可选 archive-path)。提供 label 即进入标签模式并忽略所有流水线参数。
上传测试报告示例 workflow
输入参数
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
files |
是 | - | 上传文件路径,空格分隔,例如 "metadata.xml results.xml" |
openlibing-secret |
是 | - | JSON 字符串,含 apig_code(支持 {"key":"value"} 与 {key:value} 两种写法;允许字段:apig_code/apig_key/apig_secret) |
pipeline-id |
否 | - | 流水线 ID,标签模式时忽略;未指定则回退到环境变量 ATOMGIT_WORKFLOW_ID |
pipeline-run-id |
否 | - | 流水线运行 ID;未指定则回退到 ATOMGIT_RUN_ID |
job-id |
否 | - | 作业 ID;未指定则回退到 ATOMGIT_JOB_RUN_ID |
label |
否 | - | 归档标签(如 performance、precision、simulation),仅允许字母数字、下划线、连字符、点,≤256 字符 |
archive-path |
否 | - | 自定义归档路径,必须与 label 同时使用;不允许包含 ..;仅允许字母数字、斜杠、连字符、下划线、点、空格,≤256 字符 |
输出参数
| 参数 | 说明 |
|---|---|
success |
上传是否成功(true/false) |
status-code |
HTTP 响应状态码 |
response-text |
HTTP 响应文本 |
模式说明
- 标签模式:提供
label后忽略所有 pipeline 参数;提供archive-path时最终归档路径为/{label}/{archive_path}/{filename}。 - 流水线模式:未提供
label时启用,需同时具备pipeline-id、pipeline-run-id、job-id(缺省项自动从上述环境变量回退)。 archive-path必须与label同时使用,否则报错。
使用示例
流水线模式:
- uses: openlibing/test-action/openlibing-upload-reports@v1.0.0
with:
files: metadata_test.xml results.xml
openlibing-secret: ${{ secrets.OPENLIBING_SECRET }}
pipeline-id: ${{ env.ATOMGIT_WORKFLOW_ID }}
pipeline-run-id: ${{ env.ATOMGIT_RUN_ID }}
job-id: ${{ env.ATOMGIT_JOB_RUN_ID }}
标签模式(带自定义归档路径):
- uses: openlibing/test-action/openlibing-upload-reports@v1.0.0
with:
files: metadata_test.xml
openlibing-secret: ${{ secrets.OPENLIBING_SECRET }}
label: performance
archive-path: 2026/08
上游元数据通常由 openlibing-metadata-collect 产出,结果文件可由 pytest-orch 产出。
pytest-orch
带环境调度的 pytest 用例执行器。插件克隆执行器仓与用例仓,创建虚拟环境并安装依赖,下载 pytest-testkit 与 testcase-collector wheel,调用执行器 main.py 执行用例,并从 output.json 读取产出。
调度框架插件示例 workflow
调度框架插件的使用涉及调度框架使用方法和testkit 插件,其中 调度框架 涉及用例收集、环境动态申请、用例执行等功能;testkit 插件 涉及 pytest 用例环境注册和日志记录插件等功能。
输入参数
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
git-username |
是 | - | GitCode 仓库名称,用于 clone 鉴权 |
git-password |
是 | - | GitCode 密码或令牌 |
scheduler-secret |
是 | - | 调度密钥 JSON 字符串(≤10KB、嵌套≤10 层;允许字段:apig_code/apig_key/apig_secret/x-hw-appid/x-hw-signkey/auth_token/k8s_auth) |
obs-ak |
是 | - | OBS AK 凭证(字母数字、+、/,≤256 字符) |
obs-sk |
是 | - | OBS SK 凭证(同上) |
obs-bucket-name |
是 | - | OBS 桶名(3-63 字符,小写字母、数字、连字符) |
obs-server |
是 | - | OBS 主机名(字母、数字、点、连字符,≤253 字符) |
obs-base-url |
是 | - | OBS 基础 URL(HTTP/HTTPS,≤2048 字符) |
testcase-repo |
是 | - | 用例仓库(owner/repo 格式,如 example_owner/example_repo) |
workspace |
否 | workspace |
工作目录名 |
testcase-config-file |
否 | - | 用例配置文件路径(相对或绝对,绝对路径须在 /home、/tmp、/workspace 之内) |
log-conf |
否 | - | 日志配置(JSON 字符串或文件路径,路径约束同上) |
executor-branch |
否 | master |
执行器仓库分支 |
executor-repo |
否 | openlibing/openlibing-pytest-executor |
执行器仓库(owner/repo) |
case-branch |
否 | main |
用例仓库分支 |
max-workers |
否 | 2 |
最大并发数(正整数) |
pytest-testkit-url |
否 | 见 action.yml |
pytest-testkit wheel 下载地址(必须 HTTPS 且主机为 gitcode.com) |
testcase-collector-url |
否 | 见 action.yml |
testcase-collector wheel 下载地址(约束同上) |
image-label |
否 | - | 环境选择镜像标签 |
archive-log-dir |
否 | - | 归档日志目录路径(路径约束同 testcase-config-file) |
env-model |
否 | - | 环境模型(字母数字、下划线、连字符、点) |
env-device-resource |
否 | - | 环境设备资源 JSON(≤10KB、嵌套≤10 层、键名仅字母数字/下划线/连字符、≤50 键) |
env-deploy-model |
否 | Dislocated |
环境部署模型:Co-located 或 Dislocated |
platform |
否 | codearts |
环境命名平台前缀 |
fail-case |
否 | - | 失败用例结果 JSON 文件路径(路径约束同上) |
输出参数
| 参数 | 说明 |
|---|---|
pipeline-id |
透传环境变量 ATOMGIT_WORKFLOW_ID 的流水线 ID |
job-run-id |
作业运行 ID,取自环境变量 ATOMGIT_JOB_RUN_ID |
testcase-obs-url |
用例结果 OBS URL(取自执行器 output.json 的 TestCaseOBSUrl) |
testcase-file |
用例结果文件路径(取自 TestCaseFile) |
env-log-file |
环境日志文件路径(取自 EnvLogFile) |
环境变量依赖
执行依赖以下 GitCode Actions 内置环境变量,缺失将直接失败:
ATOMGIT_JOB_RUN_ID(必需)ATOMGIT_WORKFLOW_ID(必需)ATOMGIT_RUN_ID(必需)
使用示例
- name: Run tests
id: orch
uses: openlibing/test-action/pytest-orch@v1.0.0
with:
git-username: ${{ secrets.GIT_USERNAME }}
git-password: ${{ secrets.GIT_PASSWORD }}
scheduler-secret: ${{ secrets.SCHEDULER_SECRET }}
obs-ak: ${{ secrets.OBS_AK }}
obs-sk: ${{ secrets.OBS_SK }}
obs-bucket-name: ${{ secrets.OBS_BUCKET }}
obs-server: ${{ secrets.OBS_SERVER }}
obs-base-url: ${{ secrets.OBS_BASE_URL }}
testcase-repo: my-org/my-tests
case-branch: main
max-workers: "4"
env-deploy-model: Dislocated
platform: codearts
执行结果可交由 test-result-display 生成 Markdown 汇总:
- name: Display results
uses: openlibing/test-action/test-result-display@v1.0.0
with:
json-file: ${{ steps.orch.outputs.testcase-file }}
test-result-display
从测试结果 JSON 生成 Markdown 汇总表格,并写入流水线步骤摘要($ATOMGIT_STEP_SUMMARY,未设置时回退输出到控制台)。支持多文件合并与上次结果对比(展示重试列)。
测试结果展示示例 workflow
输入参数
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
json-file |
是 | - | 测试结果 JSON 路径,多文件换行分隔;支持 SourceTask:/path/to/file.json 前缀格式以标注来源任务 |
last-json |
否 | - | 上次测试结果 JSON(仅取 passed 用例用于对比),多文件换行分隔 |
输出参数
| 参数 | 说明 |
|---|---|
total-cases |
用例总数 |
passed-cases |
通过用例数 |
not-passed-cases |
未通过用例数(失败、跳过、错误、未知等) |
JSON 结构要求
输入 JSON 顶层须含 testCasesResult 数组,每个用例对象可包含以下字段:
| 字段 | 用途 |
|---|---|
number |
用例名称/编号 |
state |
执行状态(passed 视为通过,其余计入未通过) |
beginTime / endTime |
起止时间戳(毫秒),用于计算耗时 |
resultDownloadUrl |
结果下载链接(仅允许 http/https 协议) |
使用示例
单文件展示:
- name: Display results
uses: openlibing/test-action/test-result-display@v1.0.0
with:
json-file: ${{ steps.orch.outputs.testcase-file }}
多文件并带来源前缀 + 上次结果对比:
- uses: openlibing/test-action/test-result-display@v1.0.0
with:
json-file: |
SmokeTask:smoke-results.json
FullTask:full-results.json
last-json: last-passed-results.json
输出说明
- 提供
last-json时会额外展示「重试结果」列,并用例按失败优先排序。 - 所有单元格内容均做 Markdown 转义,防止注入。
上游结果 JSON 通常由 pytest-orch 的 testcase-file 输出产出。