📢 转载信息
原文作者:Sakthi Chellapparimanam, Reena M, and Shyam Soundar
使用 Amazon Nova Act 的无头模式进行自动化冒烟测试,可以帮助开发团队在持续集成和持续交付 (CI/CD) 管道中验证核心功能。开发团队通常每天会部署代码多次,因此快速测试有助于保持应用程序质量。传统的端到端测试可能需要数小时才能完成,从而拖慢 CI/CD 管道的进度。
冒烟测试是测试的一个子集,用于验证应用程序在部署后最关键的功能是否正常工作。这些测试侧重于用户登录、核心导航和关键交易等工作流程,而不是详尽的功能覆盖。冒烟测试通常在几分钟内完成,而不是几小时,因此非常适合需要对代码更改快速提供反馈的 CI/CD 管道。
Amazon Nova Act 利用人工智能驱动的 UI 理解和自然语言处理与 Web 应用程序交互,取代了传统的 CSS 选择器。您可以使用简单的英文命令编写测试,这些命令可以适应 UI 变化,而无需维护脆弱的 CSS 选择器和复杂的测试脚本。
本文将展示如何在 CI/CD 管道中使用 Amazon Nova Act 无头模式实现自动化冒烟测试。我们将使用 SauceDemo(一个示例电子商务应用程序)作为演示目标。我们将演示如何在 CI/CD 环境中为头戴式浏览器自动化设置 Amazon Nova Act,并创建验证关键用户工作流程的冒烟测试。然后,我们将展示如何实现并行执行以最大限度地提高测试效率,配置 GitLab CI/CD 以在每次部署时自动执行测试,并应用可维护和可扩展的测试自动化的最佳实践。
解决方案概述
该解决方案包括执行冒烟测试的 Python 测试运行器、用于完整用户旅程的电子商务工作流程验证、用于自动化的 GitLab CI/CD 集成,以及用于加速测试的并行执行。无头模式在后台运行浏览器测试而无需打开浏览器窗口,这非常适合自动化测试。
下图说明了测试工作流程。
我们将按照以下步骤使用 Amazon Nova Act 实现自动化冒烟测试:
- 设置项目和依赖项。
- 创建带有登录验证的冒烟测试。
- 配置对整个电子商务工作流程的验证。
- 配置自动化测试管道。
- 配置并行执行。
先决条件
要完成本教程,您必须具备以下条件:
- 拥有 API 密钥的 Amazon Nova Act 访问权限。
- 一个 GitLab 存储库。
- UV 包管理器。有关说明,请参阅 安装 uv。
- 熟悉 Python 和 GitLab CI/CD。
设置项目和依赖项
创建您的项目并安装依赖项:
# 创建并导航到项目
uv init nova-act-smoke-tests
# 在 VS Code 中打开
code nova-act-smoke-tests
# 安装所需的包
uv add nova-act
UV 是一个快速的 Python 包管理器,可自动处理依赖项安装和虚拟环境管理,类似于 Node.js 项目中的 npm。
创建测试运行器
创建 smoke_tests.py:
import os
from nova_act import NovaAct
# 如果未设置,则检查 API 密钥
if not os.getenv("NOVA_ACT_API_KEY"):
exit("❌ Set NOVA_ACT_API_KEY environment variable")
SAUCEDEMO_URL = "https://www.saucedemo.com/"
with NovaAct(starting_page=SAUCEDEMO_URL) as nova:
nova.act("Verify you are in the login page")
print("✅ Foundation setup complete!")
测试您的设置
使用以下命令测试您的设置:
export NOVA_ACT_API_KEY="your-api-key"
uv run smoke_tests.py
NOVA_ACT_API_KEY 等环境变量能安全地将敏感信息与代码分开。
此解决方案实施了以下安全功能:
- 将 API 密钥存储在环境变量或 .env 文件中(将
.env添加到 .gitignore) - 为开发、分级和生产环境使用不同的 API 密钥
- 使用自动化脚本或日历提醒,每 90 天执行一次密钥轮换
- 通过日志监控 API 密钥使用情况,以检测未经授权的访问
您现在有了一个配置了 Amazon Nova Act 且可用于测试的现代化 Python 项目。接下来,我们将展示如何创建使用自然语言浏览器自动化的有效冒烟测试。
创建用于登录验证的冒烟测试
让我们扩展基础代码,以包含具有适当结构的完整登录测试。
添加 main 函数和登录测试
更新 smoke_tests.py:
import os
from nova_act import NovaAct
SAUCEDEMO_URL = "https://www.saucedemo.com/"
def test_login_flow():
"""Test complete login flow and product page verification"""
with NovaAct(starting_page=SAUCEDEMO_URL) as nova:
nova.act("Enter 'standard_user' in the username field")
nova.act("Enter 'secret_sauce' in the password field")
nova.act("Click the login button")
nova.act("Verify Products appear on the page")
def main():
# 如果未设置,则检查 API 密钥
if not os.getenv("NOVA_ACT_API_KEY"):
exit("❌ Set NOVA_ACT_API_KEY environment variable")
print("🚀 Starting Nova Act Smoke Test")
try:
test_login_flow()
print("✅ Login test: PASS")
except Exception as e:
print(f"❌ Login test: FAIL - {e}")
exit(1)
print("🎉 All tests passed!")
if __name__ == "__main__":
main()
测试您的登录流程
运行您的完整登录测试:
export NOVA_ACT_API_KEY="your-api-key"
uv run smoke_tests.py
您应该会看到以下输出:
🚀 Starting Nova Act Smoke Test
✅ Login test: PASS
🎉 All tests passed!
您的冒烟测试现在验证了一个完整的用户旅程,该旅程使用带有 Amazon Nova Act 的自然语言。该测试处理页面验证以确认您在登录页面上,表单交互以输入用户名和密码凭据,执行点击登录按钮的操作,以及成功验证以确认产品页面已加载。内置的错误处理提供了重试逻辑,以防登录过程中遇到任何问题,这展示了 Amazon Nova Act 的人工智能驱动的自动化如何在不依赖传统基于 CSS 选择器的测试框架的脆弱性的情况下适应动态 Web 应用程序。
虽然登录测试提供了有价值的验证,但现实世界的应用程序需要测试跨越多个页面和复杂交互的完整用户工作流程。接下来,我们将通过构建验证整个客户体验的综合电子商务旅程来扩展测试功能。
配置电子商务工作流程验证
让我们构建一个综合的电子商务工作流程,以测试从登录到退出的端到端客户旅程。
添加完整的电子商务测试
更新 smoke_tests.py 以包含完整的工作流程:
import os
from nova_act import NovaAct
SAUCEDEMO_URL = "https://www.saucedemo.com/"
def test_login_flow():
"""Test complete login flow and product page verification"""
with NovaAct(starting_page=SAUCEDEMO_URL) as nova:
nova.act("Enter 'standard_user' in the username field")
nova.act("Enter 'secret_sauce' in the password field")
nova.act("Click the login button")
nova.act("Verify Products appear on the page")
def test_ecommerce_workflow():
"""Test complete e-commerce workflow: login → shop → checkout → logout"""
with NovaAct(starting_page=SAUCEDEMO_URL) as nova:
# Login
nova.act("Enter 'standard_user' in the username field")
nova.act("Enter 'secret_sauce' in the password field")
nova.act("Click the login button")
nova.act("Verify Products appear on the page")
# Shopping
nova.act("Select Sauce Labs Backpack")
nova.act("Add Sauce Labs Backpack to the cart")
nova.act("Navigate back to products page")
nova.act("Select Sauce Labs Onesie")
nova.act("Add Sauce Labs Onesie to the cart")
nova.act("Navigate back to products page")
# Cart verification
nova.act("Click cart and Navigate to the cart page")
nova.act("Verify 2 items are in the cart")
# Checkout process
nova.act("Click the Checkout button")
nova.act("Enter 'John' in the First Name field")
nova.act("Enter 'Doe' in the Last Name field")
nova.act("Enter '12345' in the Zip/Postal Code field")
nova.act("Click the Continue button")
# Order completion
nova.act("Verify Checkout:Overview page appears")
nova.act("Click the Finish button")
nova.act("Verify 'THANK YOU FOR YOUR ORDER' appears on the page")
# Return and logout
nova.act("Click the Back Home button")
nova.act("Click the hamburger menu on the left")
nova.act("Click the Logout link")
nova.act("Verify the user is on the login page")
def main():
# 如果未设置,则检查 API 密钥
if not os.getenv("NOVA_ACT_API_KEY"):
exit("❌ Set NOVA_ACT_API_KEY environment variable")
print("🚀 Starting Nova Act E-commerce Tests")
tests = [
("Login Flow", test_login_flow),
("E-commerce Workflow", test_ecommerce_workflow)
]
passed = 0
for test_name, test_func in tests:
try:
test_func()
print(f"✅ {test_name}: PASS")
passed += 1
except Exception as e:
print(f"❌ {test_name}: FAIL - {e}")
print(f"\n📊 Results: {passed}/{len(tests)} tests passed")
if passed == len(tests):
print("🎉 All tests passed!")
else:
exit(1)
if __name__ == "__main__":
main()
测试您的电子商务工作流程
运行您的综合测试套件:
export NOVA_ACT_API_KEY="your-api-key"
uv run smoke_tests.py
您应该会看到以下输出:
🚀 Starting Nova Act E-commerce Tests
✅ Login Flow: PASS
✅ E-commerce Workflow: PASS
📊 Results: 2/2 tests passed
🎉 All tests passed!
理解电子商务旅程
工作流程测试了完整的客户体验:
- 身份验证 – 使用有效凭据登录
- 产品发现 – 浏览并选择产品
- 购物车 – 添加商品并验证购物车内容
- 结账流程 – 输入运输信息
- 订单完成 – 完成购买并验证成功
- 导航 – 返回产品并注销
下图显示了用户旅程的分步可视化指南。
您的冒烟测试现在可以验证模仿真实客户体验的完整用户旅程。电子商务工作流程展示了 Amazon Nova Act 如何处理跨越多个页面的复杂多步骤过程。通过测试从身份验证到订单完成的整个客户旅程,您正在验证应用程序的主要收入生成工作流程。
这种方法减少了维护开销,同时为应用程序的核心功能提供了全面的覆盖。
手动运行这些测试可以立即带来价值,但真正的力量来自于将它们集成到您的开发工作流程中。自动化测试执行可确保在代码更改到达生产环境之前,使用您的关键用户旅程对其进行验证。
配置自动化测试管道
有了综合的电子商务工作流程,您就可以将这些测试集成到 CI 管道中。此步骤展示了如何配置 GitLab CI/CD,以便在每次代码更改时自动运行这些冒烟测试,确保在任何部署到达生产环境之前,关键用户旅程都保持功能正常。我们展示了如何在 CI 环境中配置无头模式,同时为本地开发维护可视化调试功能。
为 CI/CD 添加无头模式
更新 smoke_tests.py 以支持 CI 环境的无头模式,方法是在两个测试函数中添加以下行:
def test_login_flow():
"""Test complete login flow and product page verification"""
headless = os.getenv("HEADLESS", "false").lower() == "true"
with NovaAct(starting_page=SAUCEDEMO_URL, headless=headless) as nova:
# ... rest of your test code remains the same
def test_ecommerce_workflow():
"""Test complete e-commerce workflow: login → shop → checkout → logout"""
headless = os.getenv("HEADLESS", "false").lower() == "true"
with NovaAct(starting_page=SAUCEDEMO_URL, headless=headless) as nova:
# ... rest of your test code remains the same
创建 GitHub Actions 工作流程
GitLab CI/CD 是 GitLab 内置的 CI 系统,可在代码更改发生时自动运行管道。管道定义在 YAML 文件中,这些文件指定何时运行测试以及执行哪些步骤。
创建 .gitlab-ci.yml:
stages:
- test
smoke-tests:
stage: test
image: mcr.microsoft.com/playwright/python:v1.40.0-jammy
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_BRANCH == "develop"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_PIPELINE_SOURCE == "web"
before_script:
- pip install uv
- uv sync
- uv run playwright install chromium
script:
- uv run python smoke_tests.py
variables:
HEADLESS: 'true'
NOVA_ACT_SKIP_PLAYWRIGHT_INSTALL: 'true'
配置 GitLab CI/CD 变量
GitLab CI/CD 变量为敏感信息(如 API 密钥)提供安全存储。这些值被加密,并且只能由您的 GitLab CI/CD 管道访问。请完成以下步骤以添加变量:
- 在项目中,选择 Settings、CI/CD 和 Variables。
- 选择 Add variable。
- 对于键,输入
NOVA_ACT_API_KEY。 - 对于值,输入您的 Amazon Nova Act API 密钥。
- 选择 Mask variable 以在作业日志中隐藏该值。
- 选择 Add variable。
理解代码更改
关键的更改是无头模式配置:
headless = os.getenv("HEADLESS", "false").lower() == "true"
with NovaAct(starting_page=SAUCEDEMO_URL, headless=headless) as nova:
此配置为不同的开发环境提供了灵活性。在未设置 HEADLESS 环境变量的本地开发期间,无头参数默认为 False,这将打开一个浏览器窗口,以便您可以看到自动化的实际运行情况。这种视觉反馈对于调试测试失败和了解 Amazon Nova Act 如何与您的应用程序交互至关重要。在将 HEADLESS 设置为 true 的 CI/CD 环境中,浏览器在后台运行而不会打开任何窗口,非常适合不需要显示功能且需要高效运行而没有视觉开销的自动化测试管道。
测试您的 CI/CD 设置
推送代码以触发工作流程:
git add .
git commit -m "Add Nova Act smoke tests with CI/CD"
git push origin main
检查 GitLab 项目中的 Pipelines 部分,查看测试运行情况。
您的冒烟测试现在作为 CI 管道的一部分自动运行,对代码更改提供即时反馈。GitLab CI/CD 集成确保在任何部署到达生产环境之前,都会验证关键用户旅程,从而降低向客户发布损坏功能的风险。
此实现展示了使用 UV 进行现代包管理如何减少 CI/CD 管道的执行时间,与传统的 pip 安装相比。结合通过 GitLab CI/CD 变量进行的安全 API 密钥管理,您的测试基础架构遵循企业安全最佳实践。
随着测试套件的增长,您可能会发现顺序运行测试可能会成为部署管道中的瓶颈。下一节通过引入并行执行来解决此挑战,以最大限度地提高 CI/CD 效率。
配置并行执行
在 CI/CD 管道成功验证单个测试用例后,下一个优化重点是通过并行执行来提高性能。并发测试执行可以通过同时运行多个浏览器实例来减少总测试时间,从而最大限度地提高 CI/CD 资源的效率,同时保持测试的可靠性和隔离性。
添加并行执行框架
更新 smoke_tests.py 以支持并发测试:
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
from nova_act import NovaAct
SAUCEDEMO_URL = "https://www.saucedemo.com/"
headless = os.getenv("HEADLESS", "false").lower() == "true"
def test_login_flow():
"""Test complete login flow and product page verification"""
with NovaAct(starting_page=SAUCEDEMO_URL, headless=headless) as nova:
nova.act("Enter 'standard_user' in the username field")
nova.act("Enter 'secret_sauce' in the password field")
nova.act("Click the login button")
# nova.act("In case of error, make sure the username and password are correct, if required re-enter the username and password")
nova.act("Verify Products appear on the page")
def test_ecommerce_workflow():
"""Test complete e-commerce workflow: login → shop → checkout → logout"""
with NovaAct(starting_page=SAUCEDEMO_URL, headless=headless) as nova:
# Login
nova.act("Enter 'standard_user' in the username field")
nova.act("Enter 'secret_sauce' in the password field")
nova.act("Click the login button")
nova.act("Verify Products appear on the page")
# Shopping
nova.act("Select Sauce Labs Backpack")
nova.act("Add Sauce Labs Backpack to the cart")
nova.act("Navigate back to products page")
nova.act("Select Sauce Labs Onesie")
nova.act("Add Sauce Labs Onesie to the cart")
nova.act("Navigate back to products page")
# Cart verification
nova.act("Click cart and Navigate to the cart page")
nova.act("Verify 2 items are in the cart")
# Checkout process
nova.act("Click the Checkout button")
nova.act("Enter 'John' in the First Name field")
nova.act("Enter 'Doe' in the Last Name field")
nova.act("Enter '12345' in the Zip/Postal Code field")
nova.act("Click the Continue button")
# Order completion
nova.act("Verify Checkout:Overview page appears")
nova.act("Click the Finish button")
nova.act("Verify 'THANK YOU FOR YOUR ORDER' appears on the page")
# Return and logout
nova.act("Click the Back Home button")
nova.act("Click the hamburger menu on the left")
nova.act("Click the Logout link")
nova.act("Verify the user is on the login page")
def run_test(test_name, test_func):
"""Execute a single test and return result"""
try:
test_func()
print(f"✅ {test_name}: PASS")
return True
except Exception as e:
print(f"❌ {test_name}: FAIL - {e}")
return False
def main():
# 如果未设置,则检查 API 密钥
if not os.getenv("NOVA_ACT_API_KEY"):
exit("❌ Set NOVA_ACT_API_KEY environment variable")
print("🚀 Starting Nova Act Tests (Parallel)")
tests = [
("Login Flow", test_login_flow),
("E-commerce Workflow", test_ecommerce_workflow)
]
# 配置并行执行
max_workers = int(os.getenv("MAX_WORKERS", "2"))
# 并行运行测试
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
future_to_test = { executor.submit(run_test, name, func): name for name, func in tests }
for future in as_completed(future_to_test):
results.append(future.result())
# 报告结果
passed = sum(results)
total = len(results)
print(f"\n📊 Results: {passed}/{total} tests passed")
if passed == total:
print("🎉 All tests passed!")
else:
exit(1)
if __name__ == "__main__":
main()
更新 GitLab CI/CD 以实现并行执行
在您的 .gitlab-ci.yml 中,MAX_WORKERS= "2" 变量已经配置了并行执行。管道在运行冒烟测试时会自动使用并行框架。
测试并行执行
运行优化后的测试:
export NOVA_ACT_API_KEY="your-api-key"
export MAX_WORKERS="2"
uv run smoke_tests.py
您应该会看到两个测试同时运行:
🚀 Starting Nova Act Tests (Parallel)
✅ Login Flow: PASS
✅ E-commerce Workflow: PASS
📊 Results: 2/2 tests passed
🎉 All tests passed!
理解并行执行
ThreadPoolExecutor 是一个 Python 类,用于管理工作线程池,允许多个任务同时运行。在这种情况下,每个线程运行一个单独的浏览器测试,从而减少了总执行时间。
# 配置工作线程数
max_workers = int(os.getenv("MAX_WORKERS", "2"))
# 并发执行测试
with ThreadPoolExecutor(max_workers=max_workers) as executor:
future_to_test = { executor.submit(run_test, name, func): name for name, func in tests }
并行执行的好处包括:执行速度更快(因为测试是同时运行而不是顺序运行),可配置的工作线程数(根据系统资源进行调整),资源效率(优化 CI/CD 计算时间),以及可扩展性(更容易添加更多测试而不会增加总运行时间)。
但是,需要注意一些重要事项。每个测试都会打开一个浏览器实例(这会增加资源使用量),测试必须相互独立才能保持适当的隔离,并且必须平衡工作线程计数与 CI 环境中可用的 CPU 和内存限制。
每个并行测试都会消耗系统资源并产生 API 使用量。从两个工作线程开始,并根据您的环境容量和成本要求进行调整。监控您的 Amazon Nova Act 用量,以优化测试速度和费用之间的平衡。
与顺序执行相比,性能提升非常显著。在顺序执行中,测试一个接一个地运行,总时间是所有单独测试时长的总和。在并行执行中,多个测试同时运行,大约在最长测试的时间内完成,随着测试套件的增长,可以节省大量时间。
您的冒烟测试现在具有并发执行功能,可显着减少总测试时间,同时保持完整的测试隔离性和可靠性。ThreadPoolExecutor 的实现允许多个浏览器实例同时运行,将您的顺序测试套件转变为并行执行,完成速度快得多。随着测试套件的增长,这种性能提升变得越来越有价值,因此全面的验证不会成为部署管道中的瓶颈。
通过 MAX_WORKERS 环境变量可配置的工作线程数,提供了平衡可用系统资源的灵活性,以优化性能。在 CI/CD 环境中,这允许您在测试执行速度和资源限制之间取得平衡,而本地开发可以使用完整的系统功能来获得更快的反馈周期。该架构保持了完整的测试独立性,确保并行执行不会引入可能影响可靠性的闪烁或交叉测试依赖项。作为最佳实践,请保持测试独立——每个测试都应该能够正确工作,而不管执行顺序或同时运行的其他测试如何。
最佳实践
完成了性能优化的测试框架,请考虑以下适用于生产准备的实践:
- 保持测试独立。测试不受执行顺序或其他同时运行的测试的影响。
- 添加重试逻辑,方法是将测试函数包装在 try-catch 块中,并为处理瞬态网络问题添加重试机制。
- 为 GitLab CI/CD 管道配置合理的超时时间,并考虑添加每日计划运行以验证生产环境。
- 对于持续维护,请建立 Amazon Nova Act API 密钥的轮换时间表,并监控测试执行时间,以便及早发现性能回归。随着应用程序的发展,您可以将新的测试函数添加到并行执行框架中,而不会影响总体运行时间,使此解决方案具有高度可扩展性,以满足未来需求。
清理
为避免产生未来费用并维护安全性,请清理所创建的资源:
- 删除或禁用未使用的 GitLab CI/CD 管道
- 每 90 天轮换一次 API 密钥并撤销未使用的密钥。
- 删除本文提供的存储库。
- 从本地环境中删除 API 密钥(不活跃项目)。
- 清除本地环境中的缓存凭据和临时文件。
结论
在本文中,我们展示了如何使用 Amazon Nova Act 无头模式为 CI/CD 管道实现自动化冒烟测试。我们演示了如何创建验证用户旅程的综合电子商务工作流程测试,实现并行执行以加快测试完成速度,以及与 GitLab CI/CD 集成以实现持续验证。
使用 Amazon Nova Act 的自然语言方法比使用 CSS 选择器的传统框架需要的维护更少。结合 UV 包管理和 GitLab CI/CD 等现代工具,此解决方案提供了快速、可靠的测试执行,可随着您的开发工作流程一起扩展。您的实现现在可以在问题进入生产环境之前发现问题,从而提供持续部署所需的快速反馈,同时保持高应用程序质量标准。
要了解有关 AWS 上的浏览器自动化和测试策略的更多信息,请浏览以下资源:
- 使用 Nova Act 开发人员工具 入门,并在 Nova Act 游乐场 中探索其功能
- ... (内容被截断)
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。



评论区