菅舛 发表于 2025-6-1 20:53:28

ai理解产品需求生成测试用例-deepseek

ai:把用例捡起来!把用例捡起来!
给大模型需求文档,让它完成设计用例,编写用例,包括功能用例、接口用例、自动化测试用例,自执行~最后发送至工作群中
直接使用deepseek即可

 
执行一下看看:

 调用ds分析需求:

 生成功能/接口用例:

 生成自动化用例:

 

 


 看一下自动生成的功能用例和接口用例:
# 为了验证用户登录功能,我们将使用 `pytest` 框架和 `requests` 库来进行 API 测试。以下是一个示例代码,展示了如何实现这个测试用例。
#
# ### 安装依赖
# 首先,确保你已经安装了 `pytest` 和 `requests` 库。如果没有安装,可以使用以下命令进行安装:
#
# ```bash
# pip install pytest requests
# ```
#
# ### 测试代码
#
# ```python
import pytest
import requests

# 定义登录API的URL
LOGIN_URL = "http://127.0.0.1:5000/login"

# 测试用例:验证用户登录功能
def test_user_login():
    # 定义测试数据
    username = "user1"
    password = "password1"
   
    # 构造请求体
    payload = {
      "username": username,
      "password": password
    }
   
    # 发送POST请求到登录API端点
    response = requests.post(LOGIN_URL, json=payload)
   
    # 验证响应状态码是否为200
    assert response.status_code == 200, f"Expected status code 200, but got {response.status_code}"
   
    # 解析API响应
    response_data = response.json()
   
    # 验证响应中是否包含预期的字段
    assert "token" in response_data, "Response does not contain 'token' field"
    assert "user_id" in response_data, "Response does not contain 'user_id' field"
   
    # 验证token和user_id是否有效
    assert isinstance(response_data["token"], str), "Token is not a string"
    assert isinstance(response_data["user_id"], int), "User ID is not an integer"

# 运行测试
if __name__ == "__main__":
    pytest.main()
# ```
#
# ### 代码说明
#
# 1. **LOGIN_URL**: 这是登录API的URL,你需要将其替换为实际的API端点。
#
# 2. **test_user_login**: 这是测试函数,使用 `pytest` 框架进行测试。
#
# 3. **payload**: 这是发送到API的请求体,包含用户名和密码。
#
# 4. **requests.post**: 发送POST请求到登录API端点。
#
# 5. **assert response.status_code == 200**: 验证响应状态码是否为200,表示请求成功。
#
# 6. **response.json()**: 解析API响应为JSON格式。
#
# 7. **assert "token" in response_data**: 验证响应中是否包含 `token` 字段。
#
# 8. **assert "user_id" in response_data**: 验证响应中是否包含 `user_id` 字段。
#
# 9. **assert isinstance(response_data["token"], str)**: 验证 `token` 是否为字符串类型。
#
# 10. **assert isinstance(response_data["user_id"], int)**: 验证 `user_id` 是否为整数类型。
#
# ### 运行测试
#
# 你可以通过以下命令运行测试:
#
# ```bash
# pytest test_login.py
# ```
#
# 如果所有断言都通过,测试将成功完成。如果有任何断言失败,`pytest` 将输出详细的错误信息,帮助你定位问题。

"""
自动化测试执行器
"""
import pytest
import os
import sys
from datetime import datetime
from typing import List, Dict
import json
from dotenv import load_dotenv

# 添加项目根目录到Python路径
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.abspath(os.path.join(current_dir, "../../../.."))
src_dir = os.path.join(project_root, "ai-test-generator", "src")
sys.path.insert(0, src_dir)

# 加载环境变量
env_path = os.path.join(project_root, "ai-test-generator", ".env")
print(f"正在加载环境变量文件: {env_path}")
load_dotenv(env_path)

try:
    from test_reporter import TestReporter, TestResult
except ImportError as e:
    print(f"错误:无法导入test_reporter模块。请确保项目结构正确。")
    print(f"当前目录: {current_dir}")
    print(f"项目根目录: {project_root}")
    print(f"src目录: {src_dir}")
    print(f"Python路径: {sys.path}")
    raise e

def run_tests(test_files: List = None) -> bool:
    """
    运行测试用例并生成报告
   
    Args:
      test_files: 要运行的测试文件列表,如果为None则运行所有测试
      
    Returns:
      bool: 所有测试是否通过
    """
    print("\n开始执行测试...")
   
    # 初始化测试报告器
    reporter = TestReporter()
   
    # 如果没有指定测试文件,则运行所有测试
    if test_files is None:
      test_files = [f for f in os.listdir(os.path.dirname(__file__))
                     if f.endswith('_test.py') and f != '_automation.py']
      print(f"将运行所有测试文件: {test_files}")
   
    all_passed = True
   
    for test_file in test_files:
      test_path = os.path.join(os.path.dirname(__file__), test_file)
      test_id = os.path.splitext(test_file)
      
      print(f"\n执行测试文件: {test_file}")
      
      # 记录测试执行
      start_time = datetime.now()
      try:
            # 运行测试
            result = pytest.main()
            status = 'passed' if result == 0 else 'failed'
            error_msg = None if result == 0 else 'Test execution failed'
            if result != 0:
                all_passed = False
            print(f"测试执行结果: {status}")
      except Exception as e:
            status = 'error'
            error_msg = str(e)
            all_passed = False
            print(f"测试执行出错: {e}")
      
      duration = (datetime.now() - start_time).total_seconds()
      
      # 记录测试结果
      reporter.add_test_result(TestResult(
            test_id=test_id,
            test_name=test_file,
            test_type='api',
            status=status,
            duration=duration,
            error_message=error_msg,
            start_time=start_time.isoformat(),
            end_time=datetime.now().isoformat()
      ))
   
    # 生成并保存报告
    reports_dir = os.path.join(project_root, "ai-test-generator", "test_cases", "reports")
    reporter.save_report(reports_dir)
   
    # 发送钉钉通知
    print("\n准备发送测试报告...")
    reporter.send_dingtalk_notification()
   
    print(f"\n测试执行完成,{'全部通过' if all_passed else '存在失败'}")
    return all_passed

if __name__ == "__main__":
    # 获取命令行参数中的测试文件
    test_files = sys.argv if len(sys.argv) > 1 else None
   
    # 运行测试
    success = run_tests(test_files)
   
    # 设置退出码
    sys.exit(0 if success else 1)metadata:
id: FUNC_1__20250313_155452
type: functional
feature: 1._**用户登录功能**:
generated_time: '2025-03-13T15:54:52.411287'
test_case:
title: 用户登录功能测试
description: 验证用户登录功能是否正常工作,确保用户能够通过正确的用户名和密码成功登录系统。
test_type: functional
prerequisites:
- 系统已安装并运行
- 用户已注册并拥有有效的用户名和密码
steps:
- 打开登录页面
- 输入有效的用户名
- 输入有效的密码
- 点击登录按钮
expected_results:
- 登录页面成功加载
- 用户名和密码输入框接受输入
- 登录按钮可点击
- 用户成功登录并跳转到主页
test_data:
    username: testuser
    password: testpassword本地简单写了个登录接口,用生成的用例跑一下,看看收集结果以及发送结果的功能
接口:

 改改用例里面的url和参数:

 

 

 


 report中的内容:

发送的wehook通知:

 代码:
main.py
1 import os
2 import sys
3 from test_generator import AITestGenerator
4 from test_case_manager import TestCaseManager
5 from dotenv import load_dotenv
6
7 def read_requirements():
8   """从用户输入读取需求文档"""
9   print("\n请输入需求文档(输入完成后请按Ctrl+D或Ctrl+Z结束):")
10   lines = []
11   try:
12         while True:
13             line = input()
14             lines.append(line)
15   except (EOFError, KeyboardInterrupt):
16         pass
17   return "\n".join(lines)
18
19 def read_requirements_from_file(file_path):
20   """从文件读取需求文档"""
21   with open(file_path, 'r', encoding='utf-8') as f:
22         return f.read()
23
24 def main():
25   # 加载环境变量
26   load_dotenv()
27   
28   # 初始化生成器和管理器
29   generator = AITestGenerator()
30   manager = TestCaseManager()
31   
32   # 解析命令行参数
33   if len(sys.argv) < 2:
34         print("用法: python main.py <command> ")
35         print("命令:")
36         print("generate <requirements_file>- 从需求文件生成测试用例")
37         print("generate                      - 从用户输入生成测试用例")
38         print("run          - 执行测试用例")
39         print("选项:")
40         print("type: functional 或 api")
41         print("feature: 特定功能名称")
42         return
43   
44   command = sys.argv
45   
46   if command == "generate":
47         # 获取需求文档
48         if len(sys.argv) > 2:
49             # 从文件读取需求
50             requirements = read_requirements_from_file(sys.argv)
51         else:
52             # 从用户输入读取需求
53             requirements = read_requirements()
54         
55         if not requirements.strip():
56             print("错误:需求文档不能为空")
57             return
58         
59         # 分析需求
60         print("\n正在分析需求文档...")
61         features = generator.analyze_requirements(requirements)
62         
63         print("\n提取的功能点:")
64         for i, feature in enumerate(features, 1):
65             print(f"{i}. {feature}")
66         
67         # 为每个功能点生成测试用例
68         test_types = ['functional', 'api', 'automation']
69         for feature in features:
70             feature_name = feature.strip().lower().replace(' ', '_')
71            
72             for test_type in test_types:
73               print(f"\n正在生成 {test_type} 测试用例,功能点:{feature}")
74               test_case = generator.generate_test_cases(feature, test_type)
75               
76               # 保存测试用例
77               if test_type == 'functional':
78                     # 保存为YAML文件
79                     file_path = manager.save_functional_test(test_case.dict(), feature_name)
80                     print(f"功能测试用例已保存到: {file_path}")
81                     
82               elif test_type == 'api':
83                     # 保存为Python测试文件和JSON数据文件
84                     case_path, data_path = manager.save_api_test(test_case.dict(), feature_name)
85                     print(f"API测试用例已保存到: {case_path}")
86                     print(f"API测试数据已保存到: {data_path}")
87                     
88               elif test_type == 'automation':
89                     # 生成自动化测试代码
90                     automation_code = generator.generate_automation_code(test_case)
91                     # 保存自动化测试代码
92                     file_path = os.path.join(manager.api_cases_dir, f"{feature_name}_automation.py")
93                     with open(file_path, 'w', encoding='utf-8') as f:
94                         f.write(automation_code)
95                     print(f"自动化测试代码已保存到: {file_path}")
96         
97         print("\n所有测试用例生成完成!")
98         print("\n您可以在以下目录找到生成的测试用例:")
99         print(f"功能测试用例: {manager.functional_dir}")
100         print(f"API测试用例: {manager.api_cases_dir}")
101         print(f"API测试数据: {manager.api_data_dir}")
102         
103   elif command == "run":
104         # 执行测试用例
105         test_type = sys.argv if len(sys.argv) > 2 else None
106         feature = sys.argv if len(sys.argv) > 3 else None
107         
108         print(f"\n开始执行测试{'(' + test_type + ')' if test_type else ''}")
109         if feature:
110             print(f"功能点: {feature}")
111         
112         success = manager.execute_tests(test_type, feature)
113         
114         print("\n测试执行完成!")
115         print(f"测试{'全部通过' if success else '存在失败'}")
116         print(f"详细报告已保存至: {manager.reports_dir}")
117   
118   else:
119         print(f"未知命令: {command}")
120         return
121
122 if __name__ == "__main__":
123   main() View Codetest_case_manager.py
1 import os
2 import sys
3 from test_generator import AITestGenerator
4 from test_case_manager import TestCaseManager
5 from dotenv import load_dotenv
6
7 def read_requirements():
8   """从用户输入读取需求文档"""
9   print("\n请输入需求文档(输入完成后请按Ctrl+D或Ctrl+Z结束):")
10   lines = []
11   try:
12         while True:
13             line = input()
14             lines.append(line)
15   except (EOFError, KeyboardInterrupt):
16         pass
17   return "\n".join(lines)
18
19 def read_requirements_from_file(file_path):
20   """从文件读取需求文档"""
21   with open(file_path, 'r', encoding='utf-8') as f:
22         return f.read()
23
24 def main():
25   # 加载环境变量
26   load_dotenv()
27   
28   # 初始化生成器和管理器
29   generator = AITestGenerator()
30   manager = TestCaseManager()
31   
32   # 解析命令行参数
33   if len(sys.argv) < 2:
34         print("用法: python main.py <command> ")
35         print("命令:")
36         print("generate <requirements_file>- 从需求文件生成测试用例")
37         print("generate                      - 从用户输入生成测试用例")
38         print("run          - 执行测试用例")
39         print("选项:")
40         print("type: functional 或 api")
41         print("feature: 特定功能名称")
42         return
43   
44   command = sys.argv
45   
46   if command == "generate":
47         # 获取需求文档
48         if len(sys.argv) > 2:
49             # 从文件读取需求
50             requirements = read_requirements_from_file(sys.argv)
51         else:
52             # 从用户输入读取需求
53             requirements = read_requirements()
54         
55         if not requirements.strip():
56             print("错误:需求文档不能为空")
57             return
58         
59         # 分析需求
60         print("\n正在分析需求文档...")
61         features = generator.analyze_requirements(requirements)
62         
63         print("\n提取的功能点:")
64         for i, feature in enumerate(features, 1):
65             print(f"{i}. {feature}")
66         
67         # 为每个功能点生成测试用例
68         test_types = ['functional', 'api', 'automation']
69         for feature in features:
70             feature_name = feature.strip().lower().replace(' ', '_')
71            
72             for test_type in test_types:
73               print(f"\n正在生成 {test_type} 测试用例,功能点:{feature}")
74               test_case = generator.generate_test_cases(feature, test_type)
75               
76               # 保存测试用例
77               if test_type == 'functional':
78                     # 保存为YAML文件
79                     file_path = manager.save_functional_test(test_case.dict(), feature_name)
80                     print(f"功能测试用例已保存到: {file_path}")
81                     
82               elif test_type == 'api':
83                     # 保存为Python测试文件和JSON数据文件
84                     case_path, data_path = manager.save_api_test(test_case.dict(), feature_name)
85                     print(f"API测试用例已保存到: {case_path}")
86                     print(f"API测试数据已保存到: {data_path}")
87                     
88               elif test_type == 'automation':
89                     # 生成自动化测试代码
90                     automation_code = generator.generate_automation_code(test_case)
91                     # 保存自动化测试代码
92                     file_path = os.path.join(manager.api_cases_dir, f"{feature_name}_automation.py")
93                     with open(file_path, 'w', encoding='utf-8') as f:
94                         f.write(automation_code)
95                     print(f"自动化测试代码已保存到: {file_path}")
96         
97         print("\n所有测试用例生成完成!")
98         print("\n您可以在以下目录找到生成的测试用例:")
99         print(f"功能测试用例: {manager.functional_dir}")
100         print(f"API测试用例: {manager.api_cases_dir}")
101         print(f"API测试数据: {manager.api_data_dir}")
102         
103   elif command == "run":
104         # 执行测试用例
105         test_type = sys.argv if len(sys.argv) > 2 else None
106         feature = sys.argv if len(sys.argv) > 3 else None
107         
108         print(f"\n开始执行测试{'(' + test_type + ')' if test_type else ''}")
109         if feature:
110             print(f"功能点: {feature}")
111         
112         success = manager.execute_tests(test_type, feature)
113         
114         print("\n测试执行完成!")
115         print(f"测试{'全部通过' if success else '存在失败'}")
116         print(f"详细报告已保存至: {manager.reports_dir}")
117   
118   else:
119         print(f"未知命令: {command}")
120         return
121
122 if __name__ == "__main__":
123   main() View Codetest_generator.py
1 import os2 import sys3 import time4 import json5 import re6 from typing import List, Dict7 import requests8 import httpx9 from dotenv import load_dotenv 10 from pydantic import BaseModel 1112 class TestCase(BaseModel): 13   """测试用例模型""" 14   title: str 15   description: str 16   test_type: str# 'functional', 'api', 'automation' 17   prerequisites: List 18   steps: List 19   expected_results: List 20   test_data: Dict 2122 class AITestGenerator: 23   def __init__(self): 24         load_dotenv() 25         self.api_key = os.getenv("DEEPSEEK_API_KEY") 26         if not self.api_key: 27             print("错误: 未找到DEEPSEEK_API_KEY环境变量。请确保.env文件中包含有效的API密钥。") 28             sys.exit(1) 29            30         self.url = "https://api.deepseek.com/chat/completions" 31         self.headers = { 32             "Content-Type": "application/json", 33             "Authorization": f"Bearer {self.api_key}" 34         } 35         print("成功初始化DeepSeek API配置") 36          37   def _format_json_prompt(self, content: str) -> str: 38         """格式化提示词,确保AI生成标准JSON格式响应""" 39         return f"""请严格按照以下JSON格式生成响应: 40 {{ 41   "title": "测试用例标题", 42   "description": "测试用例描述", 43   "test_type": "api", 44   "prerequisites": ["前置条件1", "前置条件2"], 45   "steps": ["步骤1", "步骤2"], 46   "expected_results": ["预期结果1", "预期结果2"], 47   "test_data": {{ 48         "key1": "value1", 49         "key2": "value2" 50   }} 51 }} 5253 请基于以下内容生成测试用例(请确保生成的是合法的JSON格式): 54 {content}""" 5556   def _extract_json_from_text(self, text: str) -> str: 57         """从文本中提取JSON部分""" 58         # 查找第一个 { 和最后一个 } 之间的内容 59         json_match = re.search(r'({[\s\S]*})', text) 60         if json_match: 61             return json_match.group(1) 62         return text 6364   def _clean_json_string(self, json_str: str) -> str: 65         """清理和修复常见的JSON格式问题""" 66         # 移除可能导致解析错误的Unicode字符 67         json_str = json_str.encode('utf-8', 'ignore').decode('utf-8') 68          69         # 修复常见的格式问题 70         json_str = re.sub(r'(?来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: ai理解产品需求生成测试用例-deepseek