点击蓝字
关注我们
这个专题非常受欢迎,今天将更新最后一篇啦~想复习的同学可以分别点击第一篇、第二篇和第三篇进行查看哦~接下来我们将继续学习:
7.3 RAG检索 Agent 实现
# agents/rag_retrieval_agent.pyfrom typing import List, Dict, Anyfrom loguru import loggerfrom services.knowledge_service import KnowledgeServiceclassRAGRetrievalAgent:"""RAG 检索智能体"""def __init__(self):self.knowledge_service = KnowledgeService()logger.info("RAG 检索智能体初始化完成")async def search_similar_content(self, params: Dict[str, Any]) -> Dict[str, Any]:"""搜索相似内容"""query_text = params.get('query_text')collection_id = params.get('collection_id', 4)top_k = params.get('top_k', 10)logger.info(f"搜索相似内容: {query_text[:50]}...")try:results = await self.knowledge_service.search_similar(query_text=query_text,collection_id=collection_id,top_k=top_k)logger.info(f"找到 {len(results)} 个相似结果")return {'success': True,'query_text': query_text,'total': len(results),'results': results}except Exception as e:logger.error(f"搜索相似内容失败: {str(e)}")return {'success': False,'error': str(e),'results': []}
7.4 测试用例生成 Agent 实现
基于项目中的 case_generator_agent.py,测试用例生成Agent的核心功能包括:
核心流程:
1.接收需求文档内容和RAG检索结果
2.构建企业级测试设计提示词
3.调用 MoonShot 大模型流式生成测试用例
4.实时推送生成进度给前端
5.保存生成的测试用例到数据库
关键代码片段:
# agents/case_generator_agent.py (简化版)async def generate_test_cases_with_moonshot_stream(self,combined_content: str,rag_results: List[Dict[str, Any]],task_id: int) -> AsyncGenerator[Dict[str, Any], None]:# 1. 构建提示词prompt = self._build_enterprise_test_prompt(combined_content, rag_results)# 2. 流式调用 LLMresponse_content = ""async for content_chunk in call_llm_stream(prompt, temperature=0.6):if content_chunk:response_content += content_chunk# 推送流式进度yield {"type": "streaming","content_chunk": content_chunk,"progress": min(50.0 + len(response_content) / 100, 90.0)}# 3. 保存结果task = await TestCaseGeneration.get(id=task_id)task.raw_test_case_content = response_contentawait task.save()# 4. 返回完成消息yield {"type": "result","message": "测试用例生成完成!","data": {"raw_content": response_content}}
7.5 WebSocket 实时通信
使用WebSocket实现前后端实时通信,支持流式输出。
# api/case_generation.py@router.websocket("/ws/generate")async def generate_test_cases_ws(websocket: WebSocket):"""WebSocket 流式生成测试用例"""await websocket.accept()try:# 接收请求data = await websocket.receive_json()# RAG 检索rag_results = await rag_agent.search_similar_content({'query_text': data['requirement_content'],'collection_id': data.get('knowledge_id', 4),'top_k': 10})# 流式生成测试用例async for message in test_case_generator_agent.generate_test_cases_with_moonshot_stream(combined_content=data['requirement_content'],rag_results=rag_results.get('results', []),task_id=task.id):await websocket.send_json(message)except Exception as e:await websocket.send_json({"type": "error", "message": str(e)})finally:await websocket.close()
八、前端功能的实现
8.1 前端技术栈

8.2 项目初始化
# 创建项目npm create vite@latest vue-front -- --template vuecd vue-front# 安装依赖npm install element-plus pinia vue-router axios# 启动开发服务器npm run dev
8.3 主应用配置
// main.jsimport { createApp } from 'vue'import App from './App.vue'import ElementPlus from 'element-plus'import'element-plus/dist/index.css'import router from './router'import pinia from './stores'const app = createApp(App)app.use(ElementPlus)app.use(pinia)app.use(router)app.mount('#app')
8.4 知识库管理页面
<!-- views/KnowledgeManage.vue --><template><divclass="knowledge-manage-container"><!-- 顶部导航栏 --><headerclass="header"><navclass="nav-menu"><divv-for="item in menuItems":key="item.path"class="nav-item":class="{ active: $route.path === item.path }"@click="navigateTo(item.path)">{{ item.label }}</div></nav></header><!-- 主要内容区域 --><mainclass="main-content"><Knowledge /></main></div></template><script>import { ref } from 'vue'import { useRouter } from 'vue-router'import Knowledge from '../components/Knowledge.vue'exportdefault {name: 'KnowledgeManage',components: { Knowledge },setup() {const router = useRouter()const menuItems = [{ path: '/home', label: '用例生成' },{ path: '/knowledge-manage', label: '知识库管理' },{ path: '/code-analyse', label: '代码分析' }]const navigateTo = (path) => {router.push(path)}return { menuItems, navigateTo }}}</script><stylescoped>.knowledge-manage-container {min-height: 100vh;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);}.header {background: white;padding: 020px;display: flex;justify-content: center;align-items: center;}.nav-menu {display: flex;gap: 40px;height: 60px;align-items: center;}.nav-item {padding: 8px 16px;border-radius: 20px;cursor: pointer;transition: all 0.3s ease;}.nav-item:hover {background: #f0f9ff;color: #409eff;}.nav-item.active {background: #e1f3ff;color: #409eff;font-weight: 500;}</style>
8.5 测试用例生成组件
<!-- components/TestCaseGenerator.vue --><template><divclass="test-case-generator"><el-cardclass="generator-card"><template#header><divclass="card-header"><span>测试用例生成</span></div></template><!-- 输入区域 --><divclass="input-section"><el-form:model="form"label-width="100px"><el-form-itemlabel="需求文档"><el-inputv-model="form.requirement"type="textarea":rows="10"placeholder="请输入需求文档内容..."/></el-form-item><el-form-itemlabel="知识库"><el-selectv-model="form.knowledgeId"placeholder="选择知识库"><el-optionv-for="kb in knowledgeList":key="kb.id":label="kb.name":value="kb.id"/></el-select></el-form-item><el-form-item><el-buttontype="primary":loading="generating"@click="generateTestCases">{{ generating ? '生成中...' : '生成测试用例' }}</el-button></el-form-item></el-form></div><!-- 进度显示 --><divv-if="generating"class="progress-section"><el-progress:percentage="progress":status="progressStatus" /><pclass="progress-message">{{ progressMessage }}</p></div><!-- 结果显示 --><divv-if="result"class="result-section"><h3>生成结果</h3><divclass="markdown-content"v-html="renderedResult"></div></div></el-card></div></template><script>import { ref, computed } from 'vue'import { ElMessage } from 'element-plus'import { marked } from 'marked'exportdefault {name: 'TestCaseGenerator',setup() {const form = ref({requirement: '',knowledgeId: null})const generating = ref(false)const progress = ref(0)const progressMessage = ref('')const progressStatus = ref('')const result = ref('')const knowledgeList = ref([])// 渲染 Markdownconst renderedResult = computed(() => {return marked(result.value)})// 生成测试用例const generateTestCases = async () => {if (!form.value.requirement) {ElMessage.warning('请输入需求文档内容')return}generating.value = trueprogress.value = 0result.value = ''try {// 建立 WebSocket 连接const ws = new WebSocket('ws://localhost:8000/api/v1/case-generation/ws/generate')ws.onopen = () => {// 发送请求数据ws.send(JSON.stringify({requirement_content: form.value.requirement,knowledge_id: form.value.knowledgeId || 4}))}ws.onmessage = (event) => {const message = JSON.parse(event.data)switch (message.type) {case'progress':progress.value = message.progressprogressMessage.value = message.messagebreakcase'streaming':// 流式接收内容result.value += message.content_chunkprogress.value = message.progressbreakcase'result':progress.value = 100progressStatus.value = 'success'progressMessage.value = message.messageElMessage.success('测试用例生成完成!')breakcase'complete':generating.value = falsews.close()breakcase'error':ElMessage.error(message.message)generating.value = falsews.close()break}}ws.onerror = (error) => {ElMessage.error('WebSocket 连接失败')generating.value = false}} catch (error) {ElMessage.error('生成失败:' + error.message)generating.value = false}}return {form,generating,progress,progressMessage,progressStatus,result,renderedResult,knowledgeList,generateTestCases}}}</script><stylescoped>.test-case-generator {padding: 20px;}.generator-card {max-width: 1200px;margin: 0auto;}.input-section {margin-bottom: 20px;}.progress-section {margin: 20px 0;padding: 20px;background: #f5f7fa;border-radius: 8px;}.progress-message {margin-top: 10px;text-align: center;color: #606266;}.result-section {margin-top: 20px;padding: 20px;background: #fff;border: 1px solid #dcdfe6;border-radius: 8px;}.markdown-content {line-height: 1.8;}.markdown-content h4 {color: #409eff;margin-top: 20px;}.markdown-content strong {color: #303133;}</style>
8.6 API 封装
// api/knowledge.jsimport request from '@/utils/request'// 获取知识库列表exportconst getKnowledgeList = () => {return request({url: '/api/v1/knowledges',method: 'get'})}// 创建知识库exportconst createKnowledge = (data) => {return request({url: '/api/v1/knowledges',method: 'post',data})}// 上传文件exportconst uploadFile = (knowledgeId, file) => {const formData = new FormData()formData.append('file', file)return request({url: `/api/v1/knowledges/${knowledgeId}/files`,method: 'post',data: formData,headers: {'Content-Type': 'multipart/form-data'}})}// 搜索知识库exportconst searchKnowledge = (knowledgeId, query, topK = 10) => {return request({url: `/api/v1/knowledges/${knowledgeId}/search`,method: 'get',params: { query, top_k: topK }})}
// utils/request.jsimport axios from 'axios'import { ElMessage } from 'element-plus'// 创建 axios 实例const service = axios.create({baseURL: 'http://localhost:8000',timeout: 60000})// 请求拦截器service.interceptors.request.use(config => {// 添加 tokenconst token = localStorage.getItem('token')if (token) {config.headers['Authorization'] = `Bearer ${token}`}return config},error => {return Promise.reject(error)})// 响应拦截器service.interceptors.response.use(response => {const res = response.data// 如果返回的状态码不是 200,则认为是错误if (response.status !== 200) {ElMessage.error(res.message || '请求失败')return Promise.reject(new Error(res.message || '请求失败'))}return res},error => {ElMessage.error(error.message || '网络错误')return Promise.reject(error)})exportdefault service
九、总结成果
9.1 技术总结
详细介绍了使用 FastAPI + CrewAI + ChromaDB + Vue3 开发测试用例生成 Agent 应用的完整流程。
核心技术要点:
1.FastAPI 框架
●高性能异步 Web 框架
●自动生成 API 文档
●类型提示和数据验证
●WebSocket 实时通信
2.RAG 技术
●文档分块与向量化
●ChromaDB 向量数据库
●Qwen3-Embedding 嵌入模型
●相似度检索
3.Agent 智能体
●RAG 检索 Agent
●测试用例生成 Agent
●流式输出与进度推送
●MoonShot 大模型集成
4.前端技术
●Vue 3 Composition API
●Element Plus 组件库
●Pinia 状态管理
●WebSocket 实时通信
9.2 成果展示
9.2.1 知识库管理

支持支持库的新建/删除操作,针对单个知识库支持查看/上传文件并对文件进行向量化存储以便后续测试用例生成时的业务知识检索。
9.2.2 根据需求文档生成测试用例

上传PDF格式的需求文档,Agent会自动分析需求内容,然后检索业务知识库,把检视到的业务知识和当前的需求作为上下文自动生成测试用例。


最终,Agent根据需求文档3分钟左右自动生成24条测试用例。从测试用例的最终生成效果来看,用例的可接收度在70%左右;相信这款Agent在测试用例设计环节会帮QA同学们节省不少的人工时间,从而让宝贵的人力和精力投入到更专业的事务中。
寄语
本文从 FastAPI 框架基础到完整的 RAG 知识库应用开发,涵盖了后端 API 设计、Agent 智能体实现、向量数据库应用、前端界面开发等多个方面。希望本文能够帮助读者朋友们快速掌握 FastAPI + CrewAI 开发 AI Agent 应用的核心技术,并在实际项目中灵活应用。
AI Agent 技术正在快速发展,结合 RAG 技术可以显著提升 AI Agent应用的准确性和可靠性。期待读者朋友们能够在此基础上进行更多创新和探索!使用AI技术赋能软件质量工程的提效!
E n d
声明:本文为51Testing软件测试网 晴空 用户投稿内容,该用户投稿时已经承诺独立承担涉及知识产权的相关法律责任,并且已经向51Testing承诺此文并无抄袭内容。发布本文的用途仅仅为学习交流,不做任何商用,未经授权请勿转载,否则作者和51Testing有权追究责任。如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:editor@51testing.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

夜雨聆风