找回密码
 立即注册
首页 业界区 安全 自动生成测试用例Agent工作流搭建

自动生成测试用例Agent工作流搭建

高小雨 前天 14:41
前言
  随着2024年以来AI的火爆,各行各业都在探索,当然做为测试也不能落后于人,AI是真的能解决我产很多繁杂工作,解放双手;
接下来开始今天正题;
 
本次使用的是trae国际版,主要是为了使用免费的cluade大模型;
 
Agent项目结构
  1. .trae
  2.    --rules
  3.      --project_rules.md  #存储规则
  4. markdown
  5.    --生成的用例.md
  6. task
  7.    --task.yaml   #任务流
  8. testcase   #生成的csv用例存储路径
  9. utils    #一些必要脚本
  10. workflows   #工作流
  11.    --flows.yaml
  12. xmind    #存储原始的需求分析文档
复制代码
1.png

 一、project_rules.md
  1. 你是与用户紧密协作的智能体,始终使用中文沟通,始终遵循以下顶级规则,严格遵守会受到奖赏,否则会受到惩罚。
  2. - 顶级工作模式:上传需求文件规则>预估生成用例数量>用例生成规则>用例对比补充>用例文件导出规则
  3. - 当用户输入以 "/" 开头时,必须触发对应的**工作管理任务指令**
  4. ## 任务字段说明
  5. - name: 命令名称、功能
  6. - triggers: 指令触发条件,用于判断用户是否输入了指令
  7. - description: 命令描述
  8. - file: 指令文件路径
  9. - steps: 指令运行步骤,请一步一步的进行
  10. - script: 指令运行脚本
  11. ## 工作管理任务指令
  12. [
  13.     {
  14.         "name":"将提供以下工作管理指令供用户选择",
  15.         "trigger":"/",
  16.         "description":"要求只向用户展示工作指令的trigger、name和description",
  17.     },
  18.     {
  19.         "name":"测试用例生成工作",
  20.         "description":"测试用例生成工作",
  21.         "trigger":"/test",
  22.         "file":"./task/task.yml",
  23.     },
  24.     {
  25.         "name":"xmind转md工作",
  26.         "description":"将xmind文件转换为md文件",
  27.         "trigger":"/tomd",
  28.         "script":"python ./utils/xmind_to_md.py",
  29.     },
  30.     {
  31.         "name":"初始化环境2",
  32.         "description":"初始化环境",
  33.         "trigger":"/init",
  34.         "script":"python ./utils/init_environment.py",
  35.     },
  36.     {
  37.         "name":"csv转xlsx",
  38.         "description":"所有csv用例转换为xlsx格式",
  39.         "trigger":"/toxls",
  40.         "script":"python ./utils/csv_to_xlsx.py",
  41.     }
  42. ]
复制代码
二、task.yaml
  1. # 工作流基本信息
  2. id: test_workflow
  3. name: "测试用例生成任务"
  4. description: "测试用例生成任务流程"
  5. version: "1.0"
  6. # 工作流规则
  7. rules:
  8.   - 分析要尽可能详细
  9.   - 分析需求md文件时必须阅读全部内容
  10.   - 生成的所有文档如果没有指定明确路径,则统一放在 {{testcase}} 目录下
  11.   - 任务执行时,必须查阅 input 中指定的文档,这是必要的前置知识
  12.   - 任务执行时,无论任何情况下,output内容都必须遵照doc指定文件格式
  13.   - 编写文档前,先输出内容给用户查阅,等用户确认后再写入文档,避免写错反复修改
  14. # 工作步骤定义
  15. tasks:
  16.   - name: 测试用例生成
  17.     description: "测试用例生成流程"
  18.     input:
  19.       - doc: ./agent_test/markdown/*.md
  20.     rule:
  21.       - "严格遵守当前工作、任务、步骤的规则"
  22.       - "任务结束后提示用户任务完成,并结束任务"
  23.       - doc: ./agent_test/workflows/flows.yml
  24.     output:
  25.       - doc: ./agent_test/testcase/TC_{{秒级时间戳}}.csv
复制代码
三、utils目录下的脚本
csv_to_xlsx.py
  1. import pandas as pd
  2. import os
  3. import sys
  4. def convert_csv_to_xlsx():
  5.     """将testcase目录下的所有CSV文件转换为XLSX格式,并删除原CSV文件"""
  6.     # 设置控制台输出编码为utf-8
  7.     sys.stdout.reconfigure(encoding='utf-8')
  8.    
  9.     testcase_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'testcase')
  10.    
  11.     # 确保testcase目录存在
  12.     if not os.path.exists(testcase_dir):
  13.         print(f"目录不存在: {testcase_dir}")
  14.         return
  15.    
  16.     # 遍历testcase目录下的所有csv文件
  17.     for filename in os.listdir(testcase_dir):
  18.         if filename.endswith('.csv'):
  19.             csv_path = os.path.join(testcase_dir, filename)
  20.             xlsx_path = os.path.join(testcase_dir, filename.replace('.csv', '.xlsx'))
  21.             
  22.             try:
  23.                 # 读取CSV文件
  24.                 df = pd.read_csv(csv_path, encoding='utf-8')
  25.                
  26.                 # 保存为XLSX文件
  27.                 df.to_excel(xlsx_path, index=False)
  28.                 print(f"已将 {filename} 转换为XLSX格式")
  29.                
  30.                 # 删除原CSV文件
  31.                 os.remove(csv_path)
  32.                 print(f"已删除原CSV文件: {filename}")
  33.                
  34.             except Exception as e:
  35.                 print(f"处理 {filename} 时出错: {str(e)}")
  36. if __name__ == '__main__':
  37.     convert_csv_to_xlsx()
复制代码
init_environment.py
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import sys
  5. import shutil
  6. import platform
  7. from pathlib import Path
  8. def get_windsurf_config_path():
  9.     """
  10.     获取不同系统下 Windsurf 的配置目录路径
  11.     """
  12.     # 获取用户主目录
  13.     home = os.path.expanduser("~")
  14.    
  15.     # Windows: C:\Users\<username>\.codeium\windsurf\memories
  16.     # Linux: ~/.codeium/windsurf/memories
  17.     # macOS: ~/.codeium/windsurf/memories
  18.     system = platform.system().lower()
  19.    
  20.     if system == "windows":
  21.         config_path = os.path.join(home, ".codeium", "windsurf", "memories")
  22.     elif system in ["linux", "darwin"]:  # darwin 是 macOS 的系统名
  23.         config_path = os.path.join(home, ".codeium", "windsurf", "memories")
  24.     else:
  25.         raise Exception(f"不支持的操作系统: {system}")
  26.         
  27.     return config_path
  28. def ensure_directories():
  29.     """
  30.     确保必要的目录存在,如果markdown目录存在则清空
  31.     """
  32.     try:
  33.         # 获取当前脚本所在目录的上级目录(项目根目录)
  34.         root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  35.         # 需要确保存在的目录
  36.         required_dirs = ['markdown', 'testcase', 'xmind']
  37.         
  38.         for dir_name in required_dirs:
  39.             # 使用绝对路径
  40.             dir_path = Path(os.path.join(root_dir, dir_name))
  41.             
  42.             # 如果是markdown目录且存在,清空它
  43.             if dir_name == 'markdown' and dir_path.exists():
  44.                 shutil.rmtree(dir_path)
  45.                 dir_path.mkdir()
  46.                 print(f"已清空并重新创建目录: {dir_path}")
  47.             # 如果目录不存在,创建它
  48.             elif not dir_path.exists():
  49.                 dir_path.mkdir()
  50.                 print(f"已创建目录: {dir_path}")
  51.             
  52.         return True
  53.         
  54.     except Exception as e:
  55.         print(f"初始化目录时出错: {str(e)}")
  56.         return False
  57. def init_global_rules():
  58.     """
  59.     初始化全局AI规则
  60.     """
  61.     try:
  62.         # 获取当前脚本所在目录的上级目录
  63.         current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  64.         # 使用绝对路径读取global_rules.md文件
  65.         rules_file = os.path.join(current_dir, 'global_rules.md')
  66.         
  67.         with open(rules_file, 'r', encoding='utf-8') as f:
  68.             rules_content = f.read()
  69.         
  70.         try:
  71.             # 获取 Windsurf 配置目录路径
  72.             config_path = get_windsurf_config_path()
  73.             
  74.             # 确保目录存在
  75.             os.makedirs(config_path, exist_ok=True)
  76.             
  77.             # 构建全局规则文件的完整路径
  78.             rules_file = os.path.join(config_path, "global_rules.md")
  79.             
  80.             # 写入全局规则
  81.             with open(rules_file, 'w', encoding='utf-8') as f:
  82.                 f.write(rules_content)
  83.             print(f"已初始化全局AI规则到: {rules_file}")
  84.             return True
  85.             
  86.         except Exception as e:
  87.             print(f"写入全局规则文件时出错: {str(e)}")
  88.             return False
  89.             
  90.     except Exception as e:
  91.         print(f"初始化全局AI规则时出错: {str(e)}")
  92.         return False
  93. def initialize_environment():
  94.     """
  95.     初始化环境:创建必要目录并清理markdown目录,初始化全局AI规则
  96.     """
  97.     try:
  98.         # 确保必要的目录存在
  99.         if not ensure_directories():
  100.             return False
  101.             
  102.         # 初始化全局AI规则
  103.         if not init_global_rules():
  104.             return False
  105.             
  106.         print("环境初始化完成")
  107.         return True
  108.         
  109.     except Exception as e:
  110.         print(f"初始化环境时出错: {str(e)}")
  111.         return False
  112. if __name__ == "__main__":
  113.     # 设置控制台输出编码为UTF-8
  114.     if sys.platform == 'win32':
  115.         sys.stdout.reconfigure(encoding='utf-8')
  116.     success = initialize_environment()
  117.     sys.exit(0 if success else 1)
复制代码
 
xmind_to_md.py
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import sys
  5. import xmindparser
  6. import datetime
  7. # 设置默认编码为utf-8
  8. if sys.version_info[0] == 3:
  9.     sys.stdout.reconfigure(encoding='utf-8')
  10. class XMindToMarkdown:
  11.     def __init__(self):
  12.         self.current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  13.         self.xmind_dir = os.path.join(self.current_dir, 'xmind')
  14.         self.markdown_dir = os.path.join(self.current_dir, 'markdown')
  15.         
  16.     def convert_to_markdown(self, xmind_file):
  17.         """
  18.         将XMind文件转换为Markdown格式
  19.         :param xmind_file: XMind文件名
  20.         :return: 转换后的Markdown内容
  21.         """
  22.         xmind_path = os.path.join(self.xmind_dir, xmind_file)
  23.         if not os.path.exists(xmind_path):
  24.             raise FileNotFoundError(f"XMind文件不存在: {xmind_path}")
  25.         # 解析XMind文件
  26.         xmind_content = xmindparser.xmind_to_dict(xmind_path)
  27.         if not xmind_content or not xmind_content[0].get('topic'):
  28.             raise ValueError("XMind文件格式错误或内容为空")
  29.         markdown_content = []
  30.         root_topic = xmind_content[0]['topic']
  31.         
  32.         # 添加标题
  33.         markdown_content.append(f"# {root_topic.get('title', '需求文档')}\n")
  34.         
  35.         # 添加生成时间
  36.         current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  37.         markdown_content.append(f"生成时间:{current_time}\n")
  38.         # 处理子主题
  39.         if 'topics' in root_topic:
  40.             self._process_topics(root_topic['topics'], markdown_content, level=1)
  41.         return '\n'.join(markdown_content)
  42.     def _process_topics(self, topics, markdown_content, level):
  43.         """
  44.         递归处理XMind主题
  45.         :param topics: 主题列表
  46.         :param markdown_content: Markdown内容列表
  47.         :param level: 当前层级
  48.         """
  49.         for topic in topics:
  50.             # 添加标题
  51.             title = topic.get('title', '')
  52.             markdown_content.append(f"{'#' * (level + 1)} {title}\n")
  53.             # 处理备注
  54.             if 'note' in topic:
  55.                 note = topic['note'].strip()
  56.                 if note:
  57.                     markdown_content.append(f"{note}\n")
  58.             # 处理子主题
  59.             if 'topics' in topic:
  60.                 self._process_topics(topic['topics'], markdown_content, level + 1)
  61.     def convert_all_xminds(self):
  62.         """
  63.         转换xmind目录下的所有XMind文件为Markdown格式,并保存到markdown目录
  64.         """
  65.         # 确保xmind目录存在
  66.         if not os.path.exists(self.xmind_dir):
  67.             os.makedirs(self.xmind_dir)
  68.             print(f"创建目录: {self.xmind_dir}")
  69.             return
  70.         # 确保markdown目录存在
  71.         if not os.path.exists(self.markdown_dir):
  72.             os.makedirs(self.markdown_dir)
  73.             print(f"创建目录: {self.markdown_dir}")
  74.         xmind_files = [f for f in os.listdir(self.xmind_dir) if f.endswith('.xmind')]
  75.         if not xmind_files:
  76.             print("没有找到XMind文件")
  77.             return
  78.         for xmind_file in xmind_files:
  79.             try:
  80.                 markdown_content = self.convert_to_markdown(xmind_file)
  81.                 md_filename = os.path.splitext(xmind_file)[0] + '.md'
  82.                 md_path = os.path.join(self.markdown_dir, md_filename)
  83.                
  84.                 with open(md_path, 'w', encoding='utf-8') as f:
  85.                     f.write(markdown_content)
  86.                 print(f"成功转换: {xmind_file} -> {md_filename}")
  87.             except Exception as e:
  88.                 print(f"转换 {xmind_file} 失败: {str(e)}")
  89. if __name__ == '__main__':
  90.     converter = XMindToMarkdown()
  91.     converter.convert_all_xminds()
复制代码
 
使用方法:
1.需求分析xmind文件,存放在xmind目录下
命令:
2. / 列出所有命令
3. /tomd  将xmind目录下的需求分析文件,转换为md格式;
2.png

 4./test进行用例生成
3.png

 5./toxls  将csv转换成excel格式
4.png

 
5.png

 
结果如下:
6.png

 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册