5分钟搞定测试用例!用DeepSeek+Python智能生成测试用例,效率飙升!

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


每次手动编写测试用例都头大?重复劳动、覆盖率低、维护难?

AI来拯救你! 只需一个API调用,DeepSeek能根据需求描述智能生成结构化测试用例,自动保存为JSON文件,直接对接测试框架。

效果预览


一、准备工作

1、安装Python库

pip install openai

2、获取DeepSeek API Key

前往硅基流动官网注册账号,创建应用并获取API密钥。


二、4步生成测试用例JSON文件

步骤1:调用DeepSeek API生成用例
from openai import OpenAI
import json
import re
Client = OpenAI(
    api_key='***********',
    base_url='https://api.siliconflow.cn/v1'
)

# 示例:传入提示词,调用deeseek接口

defdeepseek(prompt):
    response = Client.chat.completions.create(
        messages=[
            {'role': 'user', 'content': prompt},
        ],
        model='deepseek-ai/DeepSeek-V3',
        max_tokens=4096,
        stream=False,
    )
return response.choices[0].message.content



# 示例:登录需求

requirement_text = """
用户名长度为8到20个字符,不能包含特殊字符
密码长度为6到8个字符,必须包含大小写字母和数字
系统用户名和密码正确,登录成功,
系统用户名和密码错误,提示账户或密码错误,
超过5次错误,锁定10分钟
"""

#提示词,要求以json格式返回,指定返回字段

base_prompt = """
请以json的格式返回数据的测试用例,包含字段:
- no.(测试用例编号,累加)
- case_name(用例名称)
- steps(步骤列表)
- expected_result(预期结果)

示例格式:
{
    "test_cases":[
    {
        "no.": TC_0001
        "case_name": "用户名为空"
        "steps": ["输入用户名", "点击登录"],
        "expected_result": "提示用户名不能为空"
    }   
    ]
}
测试用例需要包含:边界值用例,异常用例,基础逻辑功能用例
"""

#需求文档内容太多冗余内容,提炼一份测试要点,便于生成测试用例

defparse_requirement(requirement):
return deepseek(f'请根据以下需求内容,提炼一份测试要点,按照1,2,3....返回,需求内容是: {requirement}')

#根据测试要点,按照指定格式返回测试用例

defgen_test_cases(content):
return deepseek(f'请针对{content}测试要点,生成一份详细的测试用例,按照{base_prompt}格式返回')


requirement = parse_requirement(requirement_text)
test_cases = gen_test_cases(requirement)

步骤2:解析API响应内容
defparse_content(response_text):
try:
        data = json.loads(response_text)
return data
except json.JSONDecodeError:
        json_str = re.search(r'```json\n(.*?)\n```', response_text, re.DOTALL)
if json_str:
return json.loads((json_str.group(1)))
else:
raise ValueError("无法解析为JSON")
cases = parse_content(test_cases)
print("生成的用例:", cases)

步骤3:保存为JSON文件
defsave_test_cases(test_cases, output_file='test_cases.json'):
with open(output_file, 'w') as f:
        f.write(json.dumps(test_cases, indent=2, ensure_ascii=False))

if cases:
    save_to_json(cases)
else:
    print("生成失败,请检查提示词或API密钥!")

步骤4:验证生成结果

生成的test_cases.json文件内容示例:

{
"test_cases": [
    {
"no.": "TC_0001",
"case_name": "用户名长度验证 - 边界值测试(7个字符)",
"steps": [
"输入7个字符的用户名",
"点击注册"
      ],
"expected_result": "提示用户名长度不符合要求"
    },
    {
"no.": "TC_0002",
"case_name": "用户名长度验证 - 边界值测试(8个字符)",
"steps": [
"输入8个字符的用户名",
"点击注册"
      ],
"expected_result": "用户名验证通过"
    },
    {
"no.": "TC_0003",
"case_name": "用户名长度验证 - 边界值测试(20个字符)",
"steps": [
"输入20个字符的用户名",
"点击注册"
      ],
"expected_result": "用户名验证通过"
    },
    {
"no.": "TC_0004",
"case_name": "用户名长度验证 - 边界值测试(21个字符)",
"steps": [
"输入21个字符的用户名",
"点击注册"
      ],
"expected_result": "提示用户名长度不符合要求"
    },
    {
"no.": "TC_0005",
"case_name": "用户名字符验证 - 特殊字符测试",
"steps": [
"输入包含特殊字符(如@!#$%)的用户名",
"点击注册"
      ],
"expected_result": "提示用户名不能包含特殊字符"
    },
    {
"no.": "TC_0006",
"case_name": "密码长度验证 - 边界值测试(5个字符)",
"steps": [
"输入5个字符的密码",
"点击注册"
      ],
"expected_result": "提示密码长度不符合要求"
    },
    {
"no.": "TC_0007",
"case_name": "密码长度验证 - 边界值测试(6个字符)",
"steps": [
"输入6个字符的密码",
"点击注册"
      ],
"expected_result": "密码验证通过"
    },
    {
"no.": "TC_0008",
"case_name": "密码长度验证 - 边界值测试(8个字符)",
"steps": [
"输入8个字符的密码",
"点击注册"
      ],
"expected_result": "密码验证通过"
    },
    {
"no.": "TC_0009",
"case_name": "密码长度验证 - 边界值测试(9个字符)",
"steps": [
"输入9个字符的密码",
"点击注册"
      ],
"expected_result": "提示密码长度不符合要求"
    },
    {
"no.": "TC_0010",
"case_name": "密码复杂度验证 - 仅小写字母测试",
"steps": [
"输入仅包含小写字母的密码(如abcdef)",
"点击注册"
      ],
"expected_result": "提示密码复杂度不符合要求"
    },
    {
"no.": "TC_0011",
"case_name": "密码复杂度验证 - 大小写字母和数字测试",
"steps": [
"输入包含大小写字母和数字的密码(如Abc123)",
"点击注册"
      ],
"expected_result": "密码验证通过"
    },
    {
"no.": "TC_0012",
"case_name": "正确用户名和密码登录",
"steps": [
"输入正确的用户名和密码",
"点击登录"
      ],
"expected_result": "登录成功"
    },
    {
"no.": "TC_0013",
"case_name": "错误用户名或密码登录",
"steps": [
"输入错误的用户名或密码",
"点击登录"
      ],
"expected_result": "提示账户或密码错误"
    },
    {
"no.": "TC_0014",
"case_name": "多次错误登录锁定机制",
"steps": [
"连续输入错误用户名或密码超过5次",
"点击登录"
      ],
"expected_result": "系统锁定账户并提示锁定10分钟"
    },
    {
"no.": "TC_0015",
"case_name": "锁定期间登录尝试",
"steps": [
"在账户锁定期间尝试登录",
"点击登录"
      ],
"expected_result": "系统拒绝登录并提示锁定信息"
    },
    {
"no.": "TC_0016",
"case_name": "解锁时间验证",
"steps": [
"等待10分钟后尝试登录",
"点击登录"
      ],
"expected_result": "系统解除锁定,允许登录"
    }
  ]
}

三、高阶技巧

1. 批量生成不同模块用例
 
modules = ['登录', '支付', '搜索']

reqirements = {'登录':'', '支付':'', '搜索':''}

for module in modules:

    prompt = f'为{module}功能设计测试用例,覆盖正向和异常场景,具体需求内容是:{reqirement[module]}'
    requirement = parse_requirement(prompt)
    response = gen_test_cases(f'请针对{requirement}测试要点,生成一份详细的测试用例,按照{base_prompt}格式返回')
    test_cases = parse_content(response)
    save_test_cases(test_cases, f'{module}_test_cases.json')
2. 自定义字段模板

在Prompt中指定详细字段:

prompt = """

请生成包含以下字段的JSON测试用例:

- case_name(用例名称)

- priority(优先级:P0/P1/P2)

- test_data(测试数据:{用户名: "test", 密码: "123"})

- expected_status_code(预期HTTP状态码)

示例:{"case_name": "正常登录", "priority": "P0", ...}

"""

四、常见问题

  1. 返回内容非JSON怎么办?

    • 检查Prompt是否明确要求JSON格式

    • 添加response_format: {'type': 'json_object'}参数,有的模型不支持json格式返回,最好在prompt明确要求

    • 使用正则提取Markdown中的JSON代码块

  2. 如何提高生成质量?

    • 提供示例:在Prompt中给出用例模板

    • 限定范围:如“生成5个边界值测试用例”


五、总结

通过DeepSeek API + Python实现例智能生成 并保存为 JSON文件,大幅提升测试效率。其核心优势:

  • 效率提升:5分钟生成覆盖边界值、异常场景的测试用例。

  • 零编码:通过自然语言描述需求,无需手动编写用例逻辑。

  • 灵活扩展:JSON文件可直接对接测试管理工具(如Jira、TestRail)

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
在这里插入图片描述​​
在这里插入图片描述​​

### 如何使用 DeepSeekPython 自动生成测试用例 #### 利用语义搜索和知识推荐能力生成基础测试用例 通过集成 DeepSeek 的强大语义搜索能力和知识推荐引擎,可以从需求文档中提取关键信息来创建初步的测试框架。这一步骤能够显著减少手动编写基本测试逻辑的时间成本。 ```python import deepseek as ds def generate_base_test_cases(requirement_doc_path): """基于需求文档生成基础测试用例""" client = ds.Client(api_key='your_api_key') requirements = client.extract_requirements_from_document(requirement_doc_path) test_cases = [] for req in requirements: case_template = f"# 测试 {req['feature']}\n" case_template += f"def test_{ds.utils.slugify(req['description'])}():\n" case_template += " pass\n\n" test_cases.append(case_template) return ''.join(test_cases) ``` [^1] #### 复用已有用例并补充新的测试案例 为了提高效率,在现有项目基础上复用已有的测试用例是非常重要的策略之一。借助于 DeepSeek 对相似度匹配的支持,可以在历史版本或其他模块中的测试集中找到可重复利用的部分,并针对当前项目的特定情况进行调整和完善。 ```python from difflib import SequenceMatcher def find_similar_tests(new_req, existing_tests): """查找与新需求最接近的历史测试用例""" best_match = None highest_ratio = 0 for et in existing_tests: ratio = SequenceMatcher(None, new_req.lower(), et.description.lower()).ratio() if ratio > highest_ratio and ratio >= 0.7: # 设置阈值以过滤不相关项 highest_ratio = ratio best_match = et return best_match existing_tests = [...] # 假设这里是从数据库加载的一系列旧版测试实例对象列表 new_requirement_text = "用户登录成功后应跳转至首页." similar_case = find_similar_tests(new_requirement_text, existing_tests) if similar_case is not None: print(f"发现类似测试:\n{similar_case.code}") else: print("未找到合适的模板.") ``` #### 分析边界条件和异常场景,增强测试覆盖范围 除了正常流程外,还需要特别关注程序可能遇到的各种极端情况以及错误输入的可能性。DeepSeek 可帮助识别潜在的风险点,并指导开发者设计更加严谨细致的验证方案。 ```python def analyze_edge_cases_and_exceptions(feature_description): """根据特性描述分析其边界条件及异常处理要求.""" edge_conditions = [ ("空字符串", ""), ("极大整数", int(9e18)), ("-1作为负索引", -1), ... ] exceptions_to_handle = ["TypeError", "ValueError"] analysis_result = { 'edge': [], 'exception': [] } for cond_name, value in edge_conditions: try: eval(f"{feature_description}(value)") # 这里仅作示意用途;实际应用时需谨慎评估安全性风险. continue except Exception as e: if type(e).__name__ in exceptions_to_handle: analysis_result['exception'].append((cond_name, str(type(e)))) return analysis_result ``` #### 构建用例数据库以便后续维护和支持团队协作 最后,将所有生成或优化后的测试用例存储在一个易于访问的位置对于长期维护至关重要。考虑到不同成员之间可能存在交流障碍,建立统一标准格式化的仓库不仅有助于内部沟通协调,也方便外部审计人员审查工作成果。 ```sql CREATE TABLE IF NOT EXISTS TestCases ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT UNIQUE NOT NULL, content BLOB NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` ```python class TestCaseRepository(): def __init__(self, db_connection_string="sqlite:///testcases.db"): self.conn = sqlite3.connect(db_connection_string) cursor = self.conn.cursor() create_table_query = """ CREATE TABLE IF NOT EXISTS TestCases( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT UNIQUE NOT NULL, content BLOB NOT NULL, created_at DATETIME DEFAULT (datetime('now', 'localtime')), updated_at DATETIME ON CONFLICT REPLACE ); """ cursor.execute(create_table_query) self.conn.commit() def add(self, title, code_content): insert_stmt = '''INSERT INTO TestCases(title,content) VALUES (?,?)''' with closing(sqlite3.connect(":memory:")) as conn: cur = conn.cursor() cur.execute(insert_stmt,(title,pickle.dumps(code_content))) conn.commit() def get_all_titles(self): select_stmt = '''SELECT DISTINCT title FROM TestCases ORDER BY created_at DESC;''' results = pd.read_sql(select_stmt,self.conn)['title'] return list(results.values) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值