使用 Amazon Nova Act 实现智能体 QA 自动化加速软件交付 – 第 2 部分
Accelerating software delivery with agentic QA automation using Amazon Nova Act – Part 2
QA Studio基于Amazon Nova Act构建的智能体QA自动化方案,通过测试套件将单个用例组织为可批量并行执行的回归测试集合,每个用例在独立AWS Fargate工作节点上并发运行。CLI工具qa-studio支持OAuth 2.0客户端凭证认证,提供--base-url、--var等环境覆盖机制,通过退出码0/1/2区分测试失败与基础设施错误,并集成GitHub Actions、GitLab CI、Jenkins等CI/CD平台。
生产质量保证(QA)工作流需要的不仅仅是单个测试的执行。你必须将测试组织成可批量运行的回归测试套件,并将其集成到持续集成和持续交付(CI/CD)流水线中,以便测试结果能够自动控制部署。在上一篇文章中,我们介绍了 QA Studio,这是一个基于 Amazon Nova Act 构建的智能体 QA 自动化参考解决方案。我们展示了如何用自然语言定义单个用例,通过 AI 驱动的视觉导航按需运行它们,并借助完整的轨迹可见性检查执行产物。在本文中,我们将扩展这一基础,展示 QA Studio 如何通过测试套件(组织和并行化执行)以及命令行界面(将智能体测试引入自动化 CI/CD 流水线)来应对批量回归测试和流水线集成。
用于组织化回归测试的测试套件
使用 QA Studio,你可以将单个用例(每个用例验证一个特定的用户旅程)分组到称为测试套件的集合中,这些套件可以一起运行。这些测试套件支持跨功能区域的结构化回归测试。套件以批处理方式并行执行:当套件运行时,每个用例在其自己的 AWS Fargate 工作节点上的 Amazon Elastic Container Service(Amazon ECS)任务中独立执行。由于每个用例在其自己的 Fargate 工作节点上运行,一个包含 20 个测试的套件可以并发执行,而不是顺序执行。与串行执行相比,这减少了套件的总持续时间。你可以按功能区域、发布阶段或测试目的来组织套件。示例包括:每次部署时验证关键路径的冒烟测试、覆盖整个应用的回归套件,以及在发布前验证跨功能工作流的集成测试。
创建和管理测试套件
你在 QA Studio Web 界面中创建测试套件,方法是提供名称、描述和可选标签,然后将现有用例添加到套件中。每个用例保留其自己的配置,包括起始 URL、变量、密钥和标头。当套件执行时,这些配置会独立应用于每个用例。
图 1 — 显示用例和执行历史的测试套件详情页面
套件执行与结果
当套件执行时,QA Studio 会为每个用例创建独立的执行记录,并将其分派到工作队列。套件执行页面提供了一个聚合视图:有多少用例成功、失败或仍在运行。你可以深入查看单个执行结果,以检查任何失败测试的轨迹日志、截图和会话记录。每个套件维护自己的执行历史,为你提供回归稳定性的纵向视图。持续通过会增强对被测功能的信心,而间歇性失败则突显需要关注的领域。
图 2 — 显示聚合状态和单个用例结果的套件执行结果
使用 QA Studio CLI 进行 CI/CD 集成
QA Studio Web 界面非常适合交互式测试创建和按需执行。CI/CD 流水线需要不同的接口:具有结构化输出的命令行执行、非交互式身份验证,以及与流水线编排器集成的退出码。QA Studio CLI(qa-studio)提供了这个接口。它连接到与 Web 应用程序相同的 API 后端。但它不是将测试分派到 Fargate 工作节点,而是在 CLI 执行的机器(例如 CI/CD 运行器)上使用 Amazon Nova Act 运行测试。结果会报告回 QA Studio 部署。
安装与身份验证
QA Studio CLI 是项目 GitHub 仓库的一部分。克隆仓库,然后将 CLI 作为 Python 包安装,并带上可选的运行器依赖项:
pip install -e "./qa-studio-cli[runner]"
对于 CI/CD 环境,CLI 支持 OAuth 2.0 客户端凭证身份验证。你在 QA Studio Web 界面中创建一个具有所需作用域(api/suite.read、api/suite.write、api/executions.read、api/executions.write、api/usecases.read、api/usecases.execute)的 OAuth 客户端,然后将凭证配置为流水线环境变量:
export OAUTH_CLIENT_ID="your-client-id"
export OAUTH_CLIENT_SECRET="your-client-secret"
export OAUTH_TOKEN_ENDPOINT="https://your-cognito-domain.auth.region.amazoncognito.com/oauth2/token"
CLI 会自动请求和缓存访问令牌,并在它们过期时刷新。无需交互式浏览器登录。
运行测试和套件
qa-studio run 命令执行单个用例或整个测试套件:
# 运行单个测试
qa-studio run --usecase-id test-123
# 运行测试套件
qa-studio run --suite-id suite-456
环境和变量覆盖
CI/CD 流水线通常需要针对不同环境运行相同的测试。CLI 支持多种覆盖机制,可以在不更改 QA Studio 中存储的测试定义的情况下修改测试行为。--base-url 标志替换起始 URL 的域名,同时保留路径和查询参数。这样,单个测试就可以针对开发、预发布或生产环境:
# 针对预发布环境运行
qa-studio run --suite-id suite-456 --base-url https://staging.example.com
# 针对生产环境运行
qa-studio run --suite-id suite-456 --base-url https://production.example.com
--var 标志覆盖用例中定义的模板变量。测试步骤中使用 {{VariableName}} 语法引用的变量会在运行时被替换。这支持环境特定的配置,而无需重复测试定义:
# 覆盖特定环境的凭证
qa-studio run --usecase-id test-123 \
--var username=staging_user \
--var password=staging_pass \
--var api_key=staging_key_123
--region 标志控制浏览器运行的 AWS 区域,--model-id 选择 Amazon Nova Act 模型版本:
qa-studio run --usecase-id test-123 \
--region eu-central-1 \
--model-id nova-act-v1.0
标头和密钥
用例可以定义自定义 HTTP 标头,这些标头会在测试执行期间随每个请求一起发送。这对于被测应用所需的身份验证令牌、功能标志或自定义标识符非常有用。标头在用例设置中配置,并在 Web 界面和 CLI 执行期间自动应用。
密钥为密码、API 密钥或令牌等敏感值提供安全存储。密钥存储在 AWS Secrets Manager 中,并进行静态加密。QA Studio 的设计确保密钥值不会写入执行日志或历史记录。测试步骤通过名称引用密钥,实际值在运行时检索。这种分离意味着 CI/CD 流水线可以执行需要凭证的测试,而无需在流水线配置或日志中暴露这些凭证。
退出码与流水线集成
CLI 使用直接映射到流水线成功和失败状态的退出码:
| 退出码 | 含义 | 流水线行为 |
|---|---|---|
| 0 | 所有测试通过 | 流水线继续 |
| 1 | 一个或多个测试失败 | 流水线失败(测试失败) |
| 2 | CLI 错误(身份验证、配置、API) | 流水线失败(基础设施错误) |
这种三状态模型允许流水线区分测试失败(退出码 1)和基础设施问题(退出码 2)。你可以为每种情况配置不同的通知或重试策略。
--format 标志控制输出格式。默认的 json 格式提供结构化输出,便于程序化消费。human 格式为流水线日志提供可读的摘要:
qa-studio run --suite-id suite-456 --format human
在执行期间,CLI 会在 QA Studio 中创建执行记录,实时更新步骤状态,并上传包括轨迹日志和会话记录在内的产物。你可以从 Web 界面监控 CLI 触发的执行,与手动触发的运行一起,维护统一的执行历史,无论测试是如何启动的。
图 3 — 显示测试结果的 CLI 执行输出
CI/CD 平台示例
以下示例演示了 QA Studio 与常见 CI/CD 工具的集成。每个示例假设 OAuth 客户端凭证和 AWS 凭证已存储为流水线密钥。
GitHub Actions
name: QA Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
smoke-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install QA Studio CLI
run: pip install -e "./qa-studio-cli[runner]"
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Run Smoke Tests
env:
OAUTH_CLIENT_ID: ${{ secrets.OAUTH_CLIENT_ID }}
OAUTH_CLIENT_SECRET: ${{ secrets.OAUTH_CLIENT_SECRET }}
OAUTH_TOKEN_ENDPOINT: ${{ secrets.OAUTH_TOKEN_ENDPOINT }}
run: |
qa-studio run \
--suite-id ${{ vars.SMOKE_TEST_SUITE_ID }} \
--base-url https://staging.example.com \
--format human
- name: Upload Artifacts
if: always()
uses: actions/upload-artifact@v3
with:
name: test-artifacts
path: ~/.qa-studio/artifacts/
产物上传步骤中的 if: always() 条件确保即使测试失败,测试记录和日志也能被保留,为你提供调查失败所需的调试上下文。
GitLab CI
stages:
- test
smoke-tests:
stage: test
image: python:3.11
before_script:
- pip install -e "./qa-studio-cli[runner]"
script:
- |
qa-studio run \
--suite-id $SMOKE_TEST_SUITE_ID \
--base-url https://staging.example.com \
--format human
variables:
AWS_DEFAULT_REGION: us-east-1
artifacts:
when: always
paths:
- ~/.qa-studio/artifacts/
expire_in: 7 days
only:
- main
- merge_requests
regression-tests:
stage: test
image: python:3.11
before_script:
- pip install -e "./qa-studio-cli[runner]"
script:
- |
qa-studio run \
--suite-id $REGRESSION_SUITE_ID \
--timeout 7200 \
--format human
variables:
AWS_DEFAULT_REGION: us-east-1
artifacts:
when: always
paths:
- ~/.qa-studio/artifacts/
expire_in: 7 days
only:
- schedules
GitLab CI 变量(OAUTH_CLIENT_ID、OAUTH_CLIENT_SECRET、OAUTH_TOKEN_ENDPOINT、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)应在项目设置中配置为受保护和掩码的 CI/CD 变量。regression-tests 作业使用 GitLab 计划触发器,仅在由流水线计划触发时运行,而不是在代码推送时运行。
Jenkins
pipeline {
agent any
environment {
AWS_DEFAULT_REGION = 'us-east-1'
}
stages {
stage('Setup') {
steps {
sh '''
python3.11 -m venv venv
. venv/bin/activate
pip install -e "./qa-studio-cli[runner]"
'''
}
}
stage('Smoke Tests') {
steps {
withCredentials([
string(credentialsId: 'oauth-client-id', variable: 'OAUTH_CLIENT_ID'),
string(credentialsId: 'oauth-client-secret', variable: 'OAUTH_CLIENT_SECRET'),
string(credentialsId: 'oauth-token-endpoint', variable: 'OAUTH_TOKEN_ENDPOINT'),
string(credentialsId: 'aws-access-key-id', variable: 'AWS_ACCESS_KEY_ID'),
string(credentialsId: 'aws-secret-access-key', variable: 'AWS_SECRET_ACCESS_KEY')
]) {
sh '''
. venv/bin/activate
qa-studio run \
--suite-id ${SMOKE_TEST_SUITE_ID} \
--base-url https://staging.example.com \
--format human
'''
}
}
}
}
post {
always {
archiveArtifacts artifacts: '~/.qa-studio/artifacts/**/*', allowEmptyArchive: true
}
}
}
Jenkins 使用 withCredentials 块将密钥注入构建环境,而不会在控制台输出中暴露它们。post.always 块无论构建结果如何都会归档测试产物。
结论
测试套件和 CI/CD 集成将 QA Studio 从一个交互式测试创建工具扩展为一个持续质量保证平台。测试套件将回归覆盖组织成可管理的集合,并支持并行执行。CLI 将智能体测试执行带入自动化流水线,支持环境覆盖、安全凭证处理,以及映射到流水线成功和失败状态的退出码。这些能力建立在上一篇文章中描述的基础之上:自然语言测试定义、AI 驱动的视觉导航和端到端轨迹可见性。它们共同展示了如何使用 Amazon Nova Act 的智能体 QA 自动化集成到现有的软件交付工作流中,提供自动化的质量反馈,而无需你维护特定于框架的测试代码。在未来的文章中,我们计划探讨智能体测试自动化如何扩展到移动应用程序。QA Studio 参考解决方案,包括测试套件和 CLI 集成,已在 GitHub 上提供。有关部署说明和详细文档,请参阅项目 README。
关于作者
Vinicius Pedroni Vinicius 是 AWS 旅游与酒店行业的资深解决方案架构师,专注于边缘服务和生成式 AI。Vinicius 还热衷于帮助客户进行云迁移,使他们能够在正确的时机采用正确的策略。
Jan Wiemers Jan 是 AWS 的资深解决方案架构师,与旅游、运输和物流行业的客户合作。他在软件行业拥有超过 20 年的经验,专注于 AI 产品开发生命周期和测试自动化,帮助客户加速构建、测试和部署 AI 驱动的解决方案。
Ryan Canty Ryan 是 Amazon AGI Labs 的解决方案架构师,在设计和扩展企业软件系统方面拥有深厚的专业知识。他与客户合作,使用 Amazon Nova Act(一项可大规模自动化 UI 工作流的 AWS 服务)构建和部署可靠的 AI 智能体集群。