Ai Test Strategy Architect

AI辅助设计测试策略、生成单元/集成/E2E测试用例并实现自动化框架。

已扫描
适合谁
QA工程师、软件开发人员
不适合谁
无代码或测试经验的非技术人员、无需自动化测试的简单项目
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @gechengling/ai-test-strategy-architect

Skill 说明

命令、参数、文件名以原文为准

AI 测试策略架构师

概述

构建能在用户发现问题之前就发现缺陷的测试体系。本 AI 驱动的测试助手可设计稳健的测试策略,生成全面的测试用例,并实现自动化框架——将质量保障从瓶颈转变为竞争优势。

触发词

  • 中文触发词:测试策略单元测试集成测试E2E测试自动化测试测试用例TDDBDDPlaywright测试Selenium测试覆盖率
  • 英文触发词:test strategyunit testingintegration testinge2e testingautomated testingtest casesTDDBDDPlaywrightSeleniumtest coverageCI/CD testing

功能

1. 测试策略设计

  • 分析项目需求与风险特征
  • 设计定制化的测试金字塔(单元/集成/E2E 的比例)
  • 根据使用场景选择合适的测试框架
  • 制定测试数据管理策略
  • 创建测试环境规格说明

2. 测试用例生成

  • 从代码函数/方法生成单元测试
  • 根据 API 规范文档创建集成测试场景
  • 设计端到端用户旅程测试
  • 构建基于属性的测试以覆盖边界情况
  • 生成负向测试用例(错误处理)

3. 测试自动化实施

  • 搭建具有合理结构的测试项目
  • 为 UI 测试实现页面对象模型(Page Object Model)
  • 设置支持数据驱动的 API 测试框架
  • 配置测试并行执行与分发机制
  • 实现视觉回归测试

4. CI/CD 流水线集成

  • 设计 CI/CD 流水线中的测试阶段
  • 配置测试报告与仪表盘
  • 设置自动质量门禁
  • 实施灰度发布/功能开关测试策略
  • 在流水线中设定性能测试阈值

工作流程

全面测试策略工作流

阶段 1:评估
├── 分析项目架构
├── 识别关键用户流程
├── 评估技术风险
├── 定义质量指标
└── 选择测试工具

阶段 2:设计
├── 设计测试金字塔
├── 明确各层级测试范围
├── 制定测试数据策略
├── 文档化测试环境需求
└── 规划测试自动化方案

阶段 3:实施
├── 搭建测试项目结构
├── 实现单元测试
├── 构建集成测试套件
├── 创建 E2E 测试场景
└── 配置测试运行器

阶段 4:自动化
├── 集成至 CI/CD
├── 设置测试报告
├── 配置并行执行
├── 实现测试监控
└── 创建质量看板

阶段 5:维护
├── 审查测试有效性
├── 优化耗时测试
├── 针对新功能更新测试
└── 归档过时测试

快速测试生成工作流

1. 输入:源代码或功能描述
   ↓
2. 分析:识别可测试单元
   - 函数/方法
   - 用户交互
   - API 接口
   ↓
3. 生成:创建测试用例
   - 正常流程场景
   - 边界情况
   - 错误场景
   - 边界条件
   ↓
4. 验证:运行测试,修复失败项
   ↓
5. 优化:提升覆盖率与执行速度

输入示例

示例 1:需进行单元测试的函数

输入代码:

def calculate_discount(price: float, discount_percent: float, is_loyal: bool) -> float:
    """
    计算折扣后的最终价格。

    参数:
        price: 原始价格
        discount_percent: 折扣百分比(0-100)
        is_loyal: 是否为忠诚会员

    返回:
        折扣后的最终价格
    """
    if price < 0:
        raise ValueError("Price cannot be negative")
    if discount_percent < 0 or discount_percent > 100:
        raise ValueError("Discount must be between 0 and 100")

    discount_multiplier = 1 - (discount_percent / 100)

    if is_loyal:
        # 忠诚会员额外享受 5% 折扣
        final_multiplier = discount_multiplier * 0.95
    else:
        final_multiplier = discount_multiplier

    return round(price * final_multiplier, 2)

生成的测试用例:

import pytest
from your_module import calculate_discount

class TestCalculateDiscount:
    """calculate_discount 函数的单元测试"""

    # 正常流程测试
    def test_no_discount_returns_original_price(self):
        """无折扣时应返回原价"""
        assert calculate_discount(100.00, 0, False) == 100.00

    def test_standard_discount(self):
        """基础折扣计算"""
        assert calculate_discount(100.00, 20, False) == 80.00

    def test_loyal_customer_extra_discount(self):
        """忠诚客户额外享受 5% 折扣"""
        result = calculate_discount(100.00, 20, True)
        expected = round(100 * 0.80 * 0.95, 2)  # 76.00
        assert result == expected

    def test_full_discount(self):
        """100% 折扣应返回 0"""
        assert calculate_discount(100.00, 100, False) == 0.00

    # 边界情况测试
    def test_zero_price(self):
        """价格为零时应返回零"""
        assert calculate_discount(0.00, 50, False) == 0.00

    def test_rounding_to_cents(self):
        """价格应四舍五入到小数点后两位"""
        result = calculate_discount(99.99, 33, False)
        assert result == round(99.99 * 0.67, 2)

    # 错误情况测试
    def test_negative_price_raises_error(self):
        """负价格应抛出 ValueError"""
        with pytest.raises(ValueError, match="Price cannot be negative"):
            calculate_discount(-10.00, 10, False)

    def test_negative_discount_raises_error(self):
        """负折扣应抛出 ValueError"""
        with pytest.raises(ValueError, match="Discount must be between"):
            calculate_discount(100.00, -5, False)

    def test_over_100_discount_raises_error(self):
        """折扣超过 100% 应抛出 ValueError"""
        with pytest.raises(ValueError, match="Discount must be between"):
            calculate_discount(100.00, 150, False)

    # 边界值测试
    def test_boundary_zero_percent_discount(self):
        """0% 折扣是有效的"""
        assert calculate_discount(50.00, 0, False) == 50.00

    def test_boundary_hundred_percent_discount(self):
        """100% 折扣是有效的"""
        assert calculate_discount(50.00, 100, False) == 0.00

示例 2:API 集成测试

输入: OpenAPI 端点定义

paths:
  /api/v1/users/{userId}/orders:
    get:
      summary: 获取用户订单
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: string
        - name: status
          in: query
          schema:
            type: string
            enum: [pending, shipped, delivered]
      responses:
        '200':
          description: 订单列表
        '401':
          description: 未授权
        '404':
          description: 用户不存在

生成的集成测试:

import pytest
import requests
from typing import Dict

BASE_URL = "https://api.example.com"
HEADERS = {"Authorization": "Bearer <test_token>"}

class TestUserOrdersAPI:
    """用户订单接口的集成测试"""

    @pytest.fixture
    def test_user_id(self):
        """提供一个已知订单的测试用户"""
        return "user_123"

    def test_get_orders_success(self, test_user_id: str):
        """应返回 200 状态码及订单列表"""
        response = requests.get(
            f"{BASE_URL}/api/v1/users/{test_user_id}/orders",
            headers=HEADERS
        )

        assert response.status_code == 200
        data = response.json()
        assert "orders" in data
        assert isinstance(data["orders"], list)

    def test_get_orders_with_status_filter(self, test_user_id: str):
        """应按状态过滤订单"""
        response = requests.get(
            f"{BASE_URL}/api/v1/users/{test_user_id}/orders",
            params={"status": "pending"},
            headers=HEADERS
        )

        assert response.status_code == 200
        orders = response.json()["orders"]
        assert all(order["status"] == "pending" for order in orders)

    def test_get_orders_unauthorized(self, test_user_id: str):
        """无有效 token 时应返回 401"""
        response = requests.get(
            f"{BASE_URL}/api/v1/users/{test_user_id}/orders"
        )

        assert response.status_code == 401

    def test_get_orders_user_not_found(self):
        """非存在用户应返回 404"""
        response = requests.get(
            f"{BASE_URL}/api/v1/users/nonexistent_user/orders",
            headers=HEADERS
        )

        assert response.status_code == 404
        assert "error" in response.json()

示例 3:端到端测试(使用 Playwright)

输入: 用户操作流程描述

用户流程:登录 -> 添加商品到购物车 -> 结账 -> 验证订单确认

生成的端到端测试:

import pytest
from playwright.sync_api import Page, expect

@pytest.fixture
def logged_in_page(page: Page):
    """在每个测试前登录用户"""
    page.goto("https://shop.example.com/login")
    page.fill('[name="email"]', "test@example.com")
    page.fill('[name="password"]', "testpassword123")
    page.click('[type="submit"]')
    page.wait_for_url("**/dashboard")
    return page

def test_complete_checkout_flow(logged_in_page: Page):
    """端到端测试:登录 -> 加入购物车 -> 结账 -> 确认订单"""
    page = logged_in_page

    # 步骤 1:浏览商品页面
    page.goto("https://shop.example.com/products/widget-pro")
    page.click('[data-testid="add-to-cart"]')

    # 步骤 2:验证购物车
    page.click('[data-testid="cart-icon"]')
    expect(page.locator('[data-testid="cart-item"]')).toHaveCount(1)

    # 步骤 3:进入结账流程
    page.click('[data-testid="checkout-button"]')
    page.fill('[name="shipping_address"]', "123 Test Street")
    page.fill('[name="zip_code"]', "12345")
    page.click('[data-testid="continue-payment"]')

    # 步骤 4:完成支付
    page.fill('[name="card_number"]', "4242424242424242")
    page.fill('[name="expiry"]', "12/28")
    page.fill('[name="cvv"]', "123")
    page.click('[data-testid="place-order"]')

    # 步骤 5:验证订单确认
    expect(page.locator('[data-testid="order-confirmation"]')).toBeVisible()
    expect(page.locator('[data-testid="order-number"]')).not_toBeEmpty()

输出模板

模板:测试策略文档

# 测试策略文档

## 项目概述
- 项目名称:[名称]
- 版本:[版本]
- 测试范围:[包含/不包含的内容]

## 质量目标
| 指标 | 目标值 | 度量方式 |
|------|--------|----------|
| 代码覆盖率 | >80% | Codecov |
| 缺陷逃逸率 | <5% | 缺陷追踪系统 |
| 测试执行时间 | <10 分钟 | CI 流水线 |

## 测试金字塔

        ╱╲
       ╱  ╲
      ╱ E2E ╲         [少量 - 10%]
     ╱──────╲
    ╱集成测试╲     [中等 - 30%]
   ╱────────────╲
  ╱  单元测试  ╲   [大量 - 60%]
 ╱────────────────╲

## 测试工具

| 层级 | 工具 | 语言 |
|------|------|------|
| 单元测试 | Pytest | Python |
| 集成测试 | pytest | Python |
| 端到端测试 | Playwright | TypeScript |
| API 测试 | REST Assured | Java |

## 测试环境
- 开发环境:https://dev.example.com
- 预发布环境:https://staging.example.com
- 生产环境:https://example.com

## 测试数据策略
- [策略说明]

## 发布标准
- [ ] 所有关键测试通过
- [ ] 覆盖率达到目标
- [ ] 无 P0 级别缺陷开放

最佳实践

测试设计方面

  1. 遵循 FIRST 原则: 快速、独立、可重复、自验证、及时
  2. 使用描述性测试命名: test_user_cannot_login_with_invalid_password
  3. 每条测试只验证一个功能点: 便于调试和维护
  4. 采用数据驱动测试: 使用参数化减少代码重复
  5. 覆盖边界情况: 空输入、空值、最大限制等

测试自动化方面

  1. 优先保证稳定性: 不稳定的测试比没有测试更糟糕
  2. 保持测试快速: 慢速测试不会被频繁运行
  3. 使用页面对象模式: 封装 UI 结构变化
  4. 隔离测试: 各测试之间无共享状态
  5. 清理测试环境: 还原测试过程中修改的状态

CI/CD 集成方面

  1. 快速失败: 优先运行最快速的测试
  2. 并行执行: 将测试分配到多个工作节点
  3. 正确报告结果: 生成可操作的测试报告
  4. 设置质量门禁: 未达标时阻止发布
  5. 监控趋势: 持续跟踪测试的不稳定情况

测试框架对比

框架适用场景支持语言
PytestPython API、单元测试Python
JestJavaScript/TypeScript 项目JS/TS
JUnit 5Java 应用程序Java
PlaywrightWeb 端到端测试TS、Python
CypressWeb 端到端测试JS/TS
Selenium旧版浏览器测试多语言
REST AssuredAPI 测试Java、Groovy
SuperTestNode.js API 测试JavaScript

版本历史

  • 1.0.0 (2026-05-15):初始版本

- 测试策略设计框架

- 单元测试生成能力

- 集成测试脚手架

- 端到端测试模式(Playwright)

- CI/CD 集成指导

G
@gechengling

已收录 5 个 Skill

相关推荐