mcpField
P
pict-test-designer

pict-test-designer

github.com/jackspace测试与质量1642 次安装12 周前更新
代码仓库

关于 pict-test-designer

使用 PICT 成对组合测试进行测试设计的技能,可将需求或代码转化为带约束的模型、测试用例和预期结果。适合处理参数和组合较多的系统的开发者与测试人员。

主要功能

  1. 01识别参数、取值和约束
  2. 02创建 PICT 模型
  3. 03生成成对测试用例
  4. 04整理用例及预期结果
  5. 05使用辅助脚本解析和格式化结果

适用场景

  1. 01为多输入功能设计覆盖测试
  2. 02为多种配置组合构建测试套件
  3. 03为 API 和 Web 表单创建测试矩阵

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jackspace/claudeskillz --skill pict-test-designer

安装后在 Claude Code 中输入/pict-test-designer确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

CHANGELOG.md
CONTRIBUTING.md
LICENSE
PUBLISHING.md
QUICKSTART.md
README.md
SKILL.json
STRUCTURE.md

详细介绍

PICT 测试设计器

此技能可使用 PICT(成对独立组合测试)系统地设计测试用例。给定需求或代码后,它会分析系统以识别测试参数,生成带有适当约束的 PICT 模型,执行模型以生成成对测试用例,并整理结果及预期输出。

何时使用此技能

在以下情况下使用此技能:

  • 为具有多个输入参数的功能、函数或系统设计测试用例
  • 为包含许多组合的配置创建测试套件
  • 需要以最少的测试用例实现全面覆盖
  • 分析需求以识别测试场景
  • 处理具有多个条件分支的代码
  • 为 API 端点、Web 表单或系统配置构建测试矩阵

工作流

按照以下流程设计测试:

1. 分析需求或代码

根据用户的需求或代码,识别:

  • 参数:输入变量、配置选项、环境因素
  • 取值:每个参数的可能取值(使用等价类划分)
  • 约束:业务规则、技术限制、参数间的依赖关系
  • 预期结果:不同组合下应发生的情况

分析示例:

对于一个具有以下需求的登录函数:

  • 用户可以使用用户名和密码登录
  • 支持双重身份验证(开启/关闭)
  • 在受信任的设备上记住登录状态
  • 登录失败 3 次后进行频率限制

识别出的参数:

  • 凭据:有效、无效
  • 双重身份验证:已启用、已禁用
  • 记住我:已勾选、未勾选
  • 之前的失败次数:0、1、2、3、4
2. 生成 PICT 模型

创建包含以下内容的 PICT 模型:

  • 清晰的参数名称
  • 定义明确的取值集合(使用等价类划分和边界值)
  • 用于排除无效组合的约束
  • 解释业务规则的注释

模型结构:

# Parameter definitions
ParameterName: Value1, Value2, Value3

# Constraints (if any)
IF [Parameter1] = "Value" THEN [Parameter2] <> "OtherValue";

请参阅 references/pict_syntax.md,了解:

  • 完整的语法参考
  • 约束语法和运算符
  • 高级功能(子模型、别名、负向测试)
  • 命令行选项
  • 详细的约束模式

请参阅 references/examples.md,了解:

  • 按领域划分的完整实际示例
  • 软件功能测试示例
  • Web 应用、API 和移动端测试示例
  • 数据库和配置测试模式
  • 身份验证、资源访问、错误处理的常见模式
3. 执行 PICT 模型

生成 PICT 模型文本并整理好供用户使用。你可以直接使用 Python 代码处理模型:

# Define parameters and constraints
parameters = {
    "OS": ["Windows", "Linux", "MacOS"],
    "Browser": ["Chrome", "Firefox", "Safari"],
    "Memory": ["4GB", "8GB", "16GB"]
}

constraints = [
    'IF [OS] = "MacOS" THEN [Browser] IN {Safari, Chrome}',
    'IF [Memory] = "4GB" THEN [OS] <> "MacOS"'
]

# Generate model text
model_lines = []
for param_name, values in parameters.items():
    values_str = ", ".join(values)
    model_lines.append(f"{param_name}: {values_str}")

if constraints:
    model_lines.append("")
    for constraint in constraints:
        if not constraint.endswith(';'):
            constraint += ';'
        model_lines.append(constraint)

model_text = "\n".join(model_lines)
print(model_text)

使用辅助脚本(可选): scripts/pict_helper.py 脚本提供了用于生成模型和整理输出的实用工具:

# Generate model from JSON config
python scripts/pict_helper.py generate config.json

# Format PICT tool output as markdown table
python scripts/pict_helper.py format output.txt

# Parse PICT output to JSON
python scripts/pict_helper.py parse output.txt

要生成实际的测试用例,用户可以:

  1. 将 PICT 模型保存到文件中(例如 model.txt)
  2. 使用在线 PICT 工具,例如:
  3. 或在本地安装 PICT(请参阅 references/pict_syntax.md)
4. 确定预期输出

对于每个生成的测试用例,根据以下内容确定预期结果:

  • 业务需求
  • 代码逻辑
  • 有效/无效组合

创建与各测试用例对应的预期输出列表。

5. 整理完整的测试套件

向用户提供:

  1. PICT 模型 - 包含参数和约束的完整模型
  2. Markdown 表格 - 以表格形式列出测试用例及其编号
  3. 预期输出 - 每个测试用例的预期结果

输出格式

按以下结构呈现结果:

## PICT Model

```
# Parameters
Parameter1: Value1, Value2, Value3
Parameter2: ValueA, ValueB

# Constraints
IF [Parameter1] = "Value1" THEN [Parameter2] = "ValueA";
```

## Generated Test Cases

| Test # | Parameter1 | Parameter2 | Expected Output |
| --- | --- | --- | --- |
| 1 | Value1 | ValueA | Success |
| 2 | Value2 | ValueB | Success |
| 3 | Value1 | ValueB | Error: Invalid combination |
...

## Test Case Summary

- Total test cases: N
- Coverage: Pairwise (all 2-way combinations)
- Constraints applied: N

最佳实践

参数标识

良好做法:

  • 使用描述性名称:AuthMethod、UserRole、PaymentType
  • 应用等价类划分:使用 FileSize: Small, Medium, Large,而不是 FileSize: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  • 包含边界值:Age: 0, 17, 18, 65, 66
  • 添加负值用于错误测试:Amount: ~-1, 0, 100, ~999999

应避免:

  • 通用名称:Param1、Value1、V1
  • 未经划分就使用过多的值
  • 遗漏边界情况
编写约束

良好做法:

  • 记录理由:# Safari only available on MacOS
  • 从简单开始,逐步添加
  • 测试约束是否按预期生效

应避免:

  • 约束过多(排除过多有效组合)
  • 约束不足(生成无效测试用例)
  • 使用缺少清晰文档的复杂嵌套逻辑
定义预期输出

具体明确:

  • “登录成功,用户重定向至仪表板”
  • “HTTP 400:凭据无效错误”
  • “显示双重身份验证提示”

避免含糊:

  • “正常”
  • “错误”
  • “成功”
可扩展性

对于大型参数集:

  • 使用子模型对顺序不同的相关参数进行分组
  • 考虑为不相关的功能分别创建测试套件
  • 从 2 阶(成对测试)开始,对关键组合提高阶数
  • 典型的成对测试相比穷举测试可减少 80-90% 的测试用例

常见模式

Web 表单测试
parameters = {
    "Name": ["Valid", "Empty", "TooLong"],
    "Email": ["Valid", "Invalid", "Empty"],
    "Password": ["Strong", "Weak", "Empty"],
    "Terms": ["Accepted", "NotAccepted"]
}

constraints = [
    'IF [Terms] = "NotAccepted" THEN [Name] = "Valid"',  # Test validation even if terms not accepted
]
API 端点测试
parameters = {
    "HTTPMethod": ["GET", "POST", "PUT", "DELETE"],
    "Authentication": ["Valid", "Invalid", "Missing"],
    "ContentType": ["JSON", "XML", "FormData"],
    "PayloadSize": ["Empty", "Small", "Large"]
}

constraints = [
    'IF [HTTPMethod] = "GET" THEN [PayloadSize] = "Empty"',
    'IF [Authentication] = "Missing" THEN [HTTPMethod] IN {GET, POST}'
]
配置测试
parameters = {
    "Environment": ["Dev", "Staging", "Production"],
    "CacheEnabled": ["True", "False"],
    "LogLevel": ["Debug", "Info", "Error"],
    "Database": ["SQLite", "PostgreSQL", "MySQL"]
}

constraints = [
    'IF [Environment] = "Production" THEN [LogLevel] <> "Debug"',
    'IF [Database] = "SQLite" THEN [Environment] = "Dev"'
]

故障排除

未生成测试用例
  • 检查约束是否过于严格
  • 验证约束语法(必须以 ; 结尾)
  • 确保约束中的参数名称与定义相符(使用 [ParameterName])
测试用例过多
  • 确认使用的是 2 阶(成对测试),而不是更高阶
  • 考虑拆分为子模型
  • 检查参数是否可以拆分到彼此独立的测试套件中
输出中存在无效组合
  • 添加缺失的约束
  • 确认约束逻辑正确
  • 检查是否需要使用 NOT 或 <> 运算符
脚本错误
  • 确保已安装 pypict:pip install pypict --break-system-packages
  • 检查 Python 版本(3.7+)
  • 确认模型语法有效

参考资料

  • references/pict_syntax.md - 完整的 PICT 语法参考,包含语法规则和运算符
  • references/examples.md - 涵盖不同领域的丰富真实示例
  • scripts/pict_helper.py - 用于生成模型和格式化输出的 Python 工具
  • PICT GitHub Repository - PICT 官方文档
  • pypict Documentation - Python 绑定文档
  • Online PICT Tools - 基于 Web 的 PICT 生成器

示例

示例 1:简单函数测试

用户请求:“为一个接受两个数字并返回结果的除法函数设计测试。”

分析:

  • 参数:被除数(数字)、除数(数字)
  • 值:使用等价类划分和边界值
    • 数字:负数、零、正数、大数
  • 约束:除数为零时无效
  • 预期输出:结果或错误

PICT 模型:

Dividend: -10, 0, 10, 1000
Divisor: ~0, -5, 1, 5, 100

IF [Divisor] = "0" THEN [Dividend] = "10";

测试用例:

测试编号被除数除数预期输出
1100错误:除数为零
2-101-10.0
30-50.0
410005200.0
5101000.1
示例 2:电子商务结账

用户请求:“为包含支付方式、配送选项和用户类型的结账流程设计测试。”

分析:

  • 支付方式:信用卡、PayPal、银行转账(受用户类型限制)
  • 配送方式:标准、加急、隔夜
  • 用户:访客、注册用户、高级用户
  • 约束:访客不能使用银行转账;高级用户可免费使用加急配送

PICT 模型:

PaymentMethod: CreditCard, PayPal, BankTransfer
ShippingMethod: Standard, Express, Overnight
UserType: Guest, Registered, Premium

IF [UserType] = "Guest" THEN [PaymentMethod] <> "BankTransfer";
IF [UserType] = "Premium" AND [ShippingMethod] = "Express" THEN [PaymentMethod] IN {CreditCard, PayPal};

**输出:**12-15 个测试用例,涵盖所有有效的支付方式/配送方式/用户组合及其预期费用和结果。

评论

支持 Markdown