基于免费大模型部署OpenClaw测试用例生成器
生成测试用例必须考虑正常、异常场景,考虑功能、性能、安全场景,用例字段包括标题、编号、前置条件、步骤描述、预期结果、优先级(P0-P4,0为最高)字段。该技能通过大语言模型(LLM)将用户输入的中文需求描述自动转换为结构化的测试用例,涵盖**功能、性能、安全**维度,并同时考虑**正常场景**和**异常场景**。- 每个测试用例必须包含以下字段:**编号**、**标题**、**优先级**(P0-P
一 搜索免费大模型
比如硅基流动https://cloud.siliconflow.cn/me/models?types=chat

比如
https://www.modelscope.cn/models

或者其他AI 聚合平台或者 厂商自身部分免费/有限调用模型。
二 设置免费的大模型
openclaw onboard进入到设置模型提供者,选中Custom Provider。填写硅基流动


设置参数

或者魔搭

在openclaw.json及model.json会生成大模型信息。
三 开发SKILL
参考https://blog.csdn.net/haolove527/article/details/157650169
使用https://chat.deepseek.com/ 输入提示词辅助生成内容:
你是一个专业的openclaw开发者,请帮忙生成一套完整的skill所需要的SKILL.MD, agent.py文件。目标:根据用户输入的中文文本需求,使用标准的openai接口调用指定的LLM,生成markdown格式的文本测试用例。生成测试用例必须考虑正常、异常场景,考虑功能、性能、安全场景,用例字段包括标题、编号、前置条件、步骤描述、预期结果、优先级(P0-P4,0为最高)字段。SKILL.MD包括资深测试工程师思考维度 When to use和How to use、Implementation、Edge cases,agent.py文件必须适配openclaw异步调用需求以及各种异常情况捕捉,有必要日志。

Agent.py如:
import os
import json
import logging
from openai import AsyncOpenAI
from openai import APITimeoutError, APIError
import asyncio
# 配置日志
logger = logging.getLogger()
logger.setLevel(logging.INFO)
#、**性能**、**安全**
async def generate_testcases(event, context):
"""
OpenClaw 异步技能入口函数。
:param event: 包含输入数据的字典,如 {"requirement": "用户需求描述"}
:param context: 运行时上下文(未使用)
:return: HTTP 风格响应字典,包含 statusCode 和 body。
"""
# 记录请求开始
logger.info("Received event: %s", json.dumps(event, ensure_ascii=False))
# 1. 验证输入
if not isinstance(event, dict):
logger.error("Invalid event format, expected dict")
return {
"statusCode": 400,
"body": json.dumps({"error": "Invalid event format, expected a dictionary"})
}
requirement = event.get('requirement')
if not requirement or not isinstance(requirement, str):
logger.error("Missing or invalid 'requirement' field")
return {
"statusCode": 400,
"body": json.dumps({"error": "Missing or invalid 'requirement' field (must be a string)"})
}
# 2. 读取环境变量
api_key = os.environ.get('OPENAI_API_KEY',"sk-XXXXX ")
if not api_key:
logger.error("OPENAI_API_KEY environment variable not set")
return {
"statusCode": 500,
"body": json.dumps({"error": "OPENAI_API_KEY environment variable not set"})
}
base_url = os.environ.get('OPENAI_BASE_URL', 'https://api.siliconflow.cn/v1')
model = os.environ.get('OPENAI_MODEL', 'Qwen/Qwen2.5-7B-Instruct')
logger.info("Using model: %s, base_url: %s", model, base_url)
print("Using model: %s, base_url: %s", model, base_url)
# 3. 初始化异步 OpenAI 客户端
try:
client = AsyncOpenAI(api_key=api_key, base_url=base_url, timeout=60.0)
except Exception as e:
logger.error("Failed to initialize OpenAI client: %s", str(e))
return {
"statusCode": 500,
"body": json.dumps({"error": f"Failed to initialize OpenAI client: {str(e)}"})
}
print("AsyncOpenAI OK")
# 4. 构造提示词(中文,强调多维度)
prompt = f"""你是一名资深的 QA 工程师。请根据以下需求描述,生成结构化的测试用例,使用 Markdown 格式输出。
需求:{requirement}
要求:
- 必须覆盖**功能**和**性能**、**安全**测试用例。
- 每个维度需同时考虑**正常场景**和**异常场景**。
- 每个测试用例必须包含以下字段:**编号**、**标题**、**优先级**(P0-P4,P0为最高)、**前置条件**、**测试步骤**、**预期结果**。
- 编号格式为 TC001、TC002……,从 1 开始递增。
- 优先级使用 P0、P1、P2、P3、P4 表示,P0 最高。
- 输出格式严格按照下面的示例,每个测试用例之间用一个空行分隔:
### TC001 - [标题]
- **优先级**: P0
- **前置条件**: [描述]
- **测试步骤**:
1. [步骤1]
2. [步骤2]
...
- **预期结果**:
- [结果1]
- [结果2]
...
生成足够覆盖需求主要场景的测试用例,数量根据需求复杂度合理确定。只输出TOP 3个用例Markdown 内容,不要包含任何额外的解释或说明。"""
# 5. 调用 LLM(异步)
try:
logger.info("Calling LLM with prompt length: %d", len(prompt))
print("Calling LLM with prompt length: %d", len(prompt))
response = await client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=4096,
top_p=1.0,
frequency_penalty=0,
presence_penalty=0,
timeout=60 # 秒
)
test_cases = response.choices[0].message.content
logger.info("LLM response received, length: %d", len(test_cases))
except APITimeoutError:
logger.error("LLM API timeout")
return {
"statusCode": 500,
"body": json.dumps({"error": "LLM API timeout"})
}
except APIError as e:
logger.error("LLM API error: %s", str(e))
return {
"statusCode": 500,
"body": json.dumps({"error": f"LLM API error: {str(e)}"})
}
except Exception as e:
logger.error("Unexpected error during LLM call: %s", str(e))
return {
"statusCode": 500,
"body": json.dumps({"error": f"Unexpected error: {str(e)}"})
}
print(test_cases)
# 6. 返回成功响应
return {
"statusCode": 200,
"body": test_cases
}
#jsonText={"requirement": "用户注册:邮箱、密码、确认密码,若邮箱未注册且密码与确认密码一致,则注册成功并发送激活邮件。"}
#asyncio.run(generate_testcases(jsonText,None))
Skill.md:
---
name: 测试用例生成器
version: 2.0.0
description: 根据用户输入的中文需求描述,调用大语言模型(LLM)生成涵盖功能、性能、安全场景及正常/异常情况的测试用例,输出 Markdown 格式,包含编号、标题、优先级(P0-P4)、前置条件、测试步骤、预期结果。
author: liang_fy
tags: [testcase generator, markdown, 中文, 功能测试, 性能测试, 安全测试]
inputs:
- name: requirement
type: string
description: 用户提供的中文需求描述文本。
required: true
example: "用户登录功能:用户输入正确的用户名和密码后,应该成功登录并跳转到首页。"
outputs:
- name: test_cases
type: string
description: 生成的测试用例,以 Markdown 格式呈现,包含多个测试用例,每个用例包含编号、标题、优先级、前置条件、测试步骤、预期结果。
example: |
### TC001 - 验证正确用户名密码登录
- **优先级**: P0
- **前置条件**: 用户已注册,拥有有效账号
- **测试步骤**:
1. 打开登录页面
2. 输入正确的用户名和密码
3. 点击登录按钮
- **预期结果**:
- 页面跳转到首页
- 顶部显示用户欢迎信息
### TC002 - 验证密码错误
- **优先级**: P1
- **前置条件**: 用户已注册
- **测试步骤**:
1. 打开登录页面
2. 输入正确的用户名和错误的密码
3. 点击登录按钮
- **预期结果**:
- 页面提示“用户名或密码错误”
- 停留在登录页
### TC003 - 验证登录接口并发性能
- **优先级**: P2
- **前置条件**: 准备 100 个有效账号,接口性能监控工具已就绪
- **测试步骤**:
1. 使用 JMeter 等工具模拟 100 个用户同时并发登录
2. 记录响应时间和成功率
- **预期结果**:
- 平均响应时间 < 2 秒
- 成功率 > 99%
### TC004 - 验证 SQL 注入攻击防护
- **优先级**: P1
- **前置条件**: 无
- **测试步骤**:
1. 在用户名输入框输入 `' OR '1'='1`,密码任意
2. 点击登录按钮
- **预期结果**:
- 页面提示用户名或密码错误,不允许登录
- 后端日志无异常 SQL 查询
env:
- name: OPENAI_API_KEY
description: OpenAI 或兼容服务的 API 密钥(必需)。
required: true
- name: OPENAI_BASE_URL
description: OpenAI API 的基础 URL,默认为 https://api.openai.com/v1。可用于 Azure OpenAI 或本地代理。
required: false
default: "https://api.openai.com/v1"
- name: OPENAI_MODEL
description: 使用的模型名称,默认为 gpt-3.5-turbo。推荐使用支持中文且能力较强的模型(如 gpt-4、deepseek-chat 等)。
required: false
default: "gpt-3.5-turbo"
---
# 测试用例生成器
该技能通过大语言模型(LLM)将用户输入的中文需求描述自动转换为结构化的测试用例,涵盖**功能、性能、安全**维度,并同时考虑**正常场景**和**异常场景**。生成的测试用例以 Markdown 格式输出,包含编号(如 TC001)、标题、优先级(P0-P4)、前置条件、测试步骤、预期结果,帮助测试团队快速建立多维度的测试覆盖。
## 资深测试工程师思考维度
### When to use(何时使用)
- **需求评审后**:需要快速生成初步测试用例,覆盖主要维度,用于测试计划编写。
- **迭代开发中**:新增功能或变更时,需要补充测试用例。
- **探索性测试前**:作为基线,确保所有关键场景已被考虑。
- **测试设计培训**:向团队成员展示如何从多角度思考测试点。
### How to use(如何使用)
1. **准备**:在 OpenClaw 平台创建技能,上传本 `SKILL.MD` 和 `agent.py`,配置所需环境变量(API 密钥、模型等)。
2. **输入**:以 JSON 格式提供需求描述,例如:
```json
{ "requirement": "用户注册:邮箱、密码、确认密码,若邮箱未注册且密码与确认密码一致,则注册成功并发送激活邮件。" }
设置3个环境变量OPENAI_API_KEY、OPENAI_BASE_URL、OPENAI_MODEL。
或者修改Agent.py 3个默认值, 可以打开注释调试是否通过,如果有依赖未安装,则pip3 install 对应依赖,重启gateway:openclaw gateway restart
暂不发布到clawhub仓库。
四 飞书/钉钉触发调用SKILL


同时,在用户目录 C:\Users\liang\.openclaw\workspace 下生成文件。
五 错误解析
1、 出现
09:22:49 [diagnostic] lane task error: lane=main durationMs=613 error="FailoverError: ⚠️ API rate limit reached. Please try again later."
如上说明被飞书限流了,界面出现 导致404或400错误。此时更换另一种渠道,比如钉钉。
2、Model context window too small (4096 tokens). Minimum is 16000错误
可能原因包括custom provider的API服务商默认限制、未正确传递参数,先建议设置openclaw.json上模型maxTokens=32768、contextWindows=32768。
六 参考
https://blog.csdn.net/haolove527/article/details/157650169
https://blog.csdn.net/weixin_45449540/article/details/157967971
https://developer.aliyun.com/article/1698335
https://blog.csdn.net/2403_86749814/article/details/158386993
更多推荐

所有评论(0)