问题背景

在AI测试生成工作流中,AI服务需要接收请求、处理文档、调用DeepSeek API并返回测试代码。技术栈选择涉及:

  • FastAPI:Python异步Web框架,适合快速原型、AI集成(Python生态)
  • Spring Boot:Java企业级框架,适合与现有Java测试平台集成

为什么使用FastAPI?

  1. AI生态优势:Python在机器学习、自然语言处理、向量数据库(ChromaDB)等方面有丰富库。
  2. 开发效率:代码简洁,异步支持好,适合处理IO密集型任务(如调用外部API)。
  3. 轻量级:启动快,资源消耗低,适合微服务部署。
  4. 与向量数据库集成:ChromaDB、LangChain等库原生支持Python。

为什么也可以使用Spring Boot?

  1. 统一技术栈:如果测试平台已经是Java(如TestNG、Selenium),Spring Boot可减少技术异构性。
  2. 企业级特性:事务管理、安全、监控等成熟。
  3. 团队熟悉度:Java团队更易维护。

决策建议

  • 如果AI服务需要大量Python AI库(如嵌入模型、向量检索),选择FastAPI。
  • 如果团队以Java为主,且AI服务逻辑简单(仅HTTP代理),可用Spring Boot包装Python服务(通过子进程或gRPC)。

FastAPI调用AI服务生成测试用例Demo

1. 服务端代码 (ai_service.py)

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import openai
import os
from typing import List

app = FastAPI(title="AI Test Generation Service")

# 配置DeepSeek API(假设使用OpenAI兼容接口)
openai.api_key = os.getenv("DEEPSEEK_API_KEY")
openai.api_base = "https://api.deepseek.com"

class TestGenerationRequest(BaseModel):
    requirement_doc: str
    api_doc: str
    language: str = "java"
    framework: str = "testng"

class TestGenerationResponse(BaseModel):
    test_code: str
    status: str

@app.post("/generate-test", response_model=TestGenerationResponse)
async def generate_test(request: TestGenerationRequest):
    """根据需求和API文档生成测试代码"""
    prompt = f"""
你是一个资深测试工程师,请根据以下需求文档和API文档,生成一个{request.framework.upper()}测试类。

## 需求文档
{request.requirement_doc}

## API文档
{request.api_doc}

## 要求
- 使用{request.language}语言,{request.framework}框架。
- 使用RestAssured发送HTTP请求。
- 包含至少3个测试方法:正向测试、边界测试、异常测试。
- 每个测试方法包含断言。
- 代码格式符合Google Java Style。

请只输出Java代码,不要额外解释。
"""
    try:
        response = openai.ChatCompletion.create(
            model="deepseek-chat",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.2,
            max_tokens=2000
        )
        test_code = response.choices[0].message.content.strip()
        return TestGenerationResponse(test_code=test_code, status="success")
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"AI generation failed: {str(e)}")

@app.get("/health")
async def health():
    return {"status": "healthy"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

2. 客户端调用示例 (client.py)

import requests
import json

url = "http://localhost:8000/generate-test"

payload = {
    "requirement_doc": "用户登录功能:用户通过用户名和密码登录,成功返回token,失败返回401。",
    "api_doc": "POST /api/login\nrequestBody: {username: string, password: string}\nresponses: 200 {token: string}, 401 {error: 'Invalid credentials'}",
    "language": "java",
    "framework": "testng"
}

response = requests.post(url, json=payload)
if response.status_code == 200:
    result = response.json()
    print("生成的测试代码:")
    print(result["test_code"])
else:
    print(f"请求失败: {response.status_code}, {response.text}")

3. 使用向量数据库增强的版本(集成ChromaDB)

from fastapi import FastAPI
import chromadb
from sentence_transformers import SentenceTransformer

app = FastAPI()
chroma_client = chromadb.PersistentClient(path="./chroma_db")
collection = chroma_client.get_or_create_collection(name="test_cases")
embedder = SentenceTransformer('all-MiniLM-L6-v2')

@app.post("/generate-test-with-rag")
async def generate_test_with_rag(request: TestGenerationRequest):
    # 1. 向量检索相似历史用例
    query_embedding = embedder.encode(request.requirement_doc).tolist()
    results = collection.query(
        query_embeddings=[query_embedding],
        n_results=3
    )
    similar_cases = results['documents'][0] if results['documents'] else []
    
    # 2. 构建增强提示词
    prompt = f"""
需求:{request.requirement_doc}
参考历史用例:
{chr(10).join(similar_cases)}
...(其余同上)
"""
    # 调用AI生成
    # ...

Spring Boot 实现同等功能的Demo

1. 服务端 (AiServiceController.java)

@RestController
@RequestMapping("/api/ai")
public class AiServiceController {
    
    @PostMapping("/generate-test")
    public ResponseEntity<TestGenerationResponse> generateTest(@RequestBody TestGenerationRequest request) {
        // 调用Python服务(通过HTTP或gRPC)
        String pythonServiceUrl = "http://localhost:8000/generate-test";
        RestTemplate restTemplate = new RestTemplate();
        try {
            TestGenerationResponse response = restTemplate.postForObject(
                pythonServiceUrl, request, TestGenerationResponse.class);
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            return ResponseEntity.status(500).body(
                new TestGenerationResponse("", "error: " + e.getMessage()));
        }
    }
}

2. 直接集成AI(使用DeepSeek Java SDK)

如果DeepSeek提供Java SDK,可直接在Spring Boot中调用,避免跨语言。

总结

  • FastAPI 更适合快速迭代、AI密集型任务。
  • Spring Boot 更适合与现有Java平台深度集成。
  • 推荐架构:FastAPI作为AI微服务 + Spring Boot作为网关/业务层,通过HTTP/gRPC通信。

下一步

  1. 根据团队技能选择主要框架。
  2. 实现向量数据库集成(ChromaDB)以提升生成质量。
  3. 添加验证、日志、监控等生产就绪功能。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐