去年夏天,字节跳动推出的TRAE AI编程IDE在开发者社区掀起了一阵热潮。作为Cursor的免费替代品,它最吸引我的功能是7月份推出的Solo模式——这个号称能"10分钟搭建完整项目"的特性让我这个常年写接口测试脚本的老手也产生了兴趣。实际体验下来,用TRAE Solo模式从零构建一个基于pytest+requests+excel+allure的接口自动化测试框架,整个过程只用了2小时,其中还包括了调试和优化时间。
这个自动化测试项目包含几个核心能力:通过Excel管理测试用例、自动处理接口签名和Token、支持多种HTTP请求方式,以及用Allure生成可视化报告。最让我惊讶的是,TRAE不仅生成了基础框架代码,还自动创建了Mock服务器和示例测试用例,这种开箱即用的体验确实颠覆了传统测试框架的搭建方式。
在开始使用TRAE生成项目前,需要确保本地环境满足以下条件:
建议使用virtualenv创建隔离环境:
bash复制python -m venv trae_test_env
source trae_test_env/bin/activate # Linux/Mac
# 或 trae_test_env\Scripts\activate # Windows
与传统AI编程助手不同,TRAE的Solo模式具有三个显著特点:
启动Solo模式只需要在TRAE界面输入简单指令:
code复制/create pytest-api-test-project
--stack requests+pytest+excel+allure
--features token-management,signature-verification
TRAE生成的项目采用了分层架构设计:
code复制api-auto-test/
├── config/ # 配置文件
│ ├── settings.py # 全局配置
│ └── endpoints.yaml # 接口端点定义
├── data/ # 测试数据
│ ├── test_cases.xlsx # Excel测试用例
│ └── mock_data.json # Mock数据
├── testcases/ # 测试用例
│ ├── auth_test.py # 认证相关用例
│ └── product_test.py # 产品相关用例
├── utils/ # 工具类
│ ├── excel_reader.py # Excel读取
│ ├── signature.py # 签名生成
│ └── token_manager.py # Token管理
└── reports/ # 测试报告
在接口测试中,签名验证是最容易出错的环节之一。TRAE生成的signature.py实现了以下安全机制:
python复制import hashlib
def generate_sign(params, secret_key):
# 1. 过滤空值参数
filtered = {k: v for k, v in params.items() if v is not None}
# 2. 参数名ASCII码排序
sorted_params = sorted(filtered.items(), key=lambda x: x[0])
# 3. 拼接键值对
query_string = '&'.join([f"{k}={v}" for k, v in sorted_params])
# 4. 追加密钥并MD5加密
raw_sign = query_string + f"&key={secret_key}"
return hashlib.md5(raw_sign.encode('utf-8')).hexdigest()
注意事项:实际使用中发现TRAE默认生成的签名算法可能需要根据API文档调整:
- 参数URL编码处理
- 空字符串与None的区别处理
- 嵌套参数的展平策略
TRAE生成的token_manager.py采用了装饰器模式实现Token自动刷新:
python复制import time
from functools import wraps
class TokenManager:
def __init__(self):
self._token = None
self._expire_time = 0
def refresh_token(self):
# 调用登录接口获取新token
response = requests.post('/login', json=credentials)
self._token = response.json()['token']
self._expire_time = time.time() + 3600 # 假设1小时过期
def token_valid(self):
return self._token and time.time() < self._expire_time
def token_required(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
if not self.token_valid():
self.refresh_token()
kwargs['headers']['Authorization'] = f"Bearer {self._token}"
return func(*args, **kwargs)
return wrapper
TRAE生成的excel_reader.py支持动态解析测试用例:
python复制import openpyxl
from dataclasses import dataclass
@dataclass
class TestCase:
name: str
method: str
url: str
headers: dict
params: dict
expected: dict
class ExcelParser:
def __init__(self, file_path):
self.wb = openpyxl.load_workbook(file_path)
def get_testcases(self, sheet_name):
sheet = self.wb[sheet_name]
cases = []
for row in sheet.iter_rows(min_row=2, values_only=True):
case = TestCase(
name=row[0],
method=row[1],
url=row[2],
headers=self._parse_dict(row[3]),
params=self._parse_dict(row[4]),
expected=self._parse_dict(row[5])
)
cases.append(case)
return cases
def _parse_dict(self, json_str):
return json.loads(json_str) if json_str else {}
配套的Excel模板包含以下列:
| 用例名称 | 请求方法 | 接口路径 | 请求头(JSON) | 请求参数(JSON) | 预期结果(JSON) |
|---|---|---|---|---|---|
| 用户登录 | POST | /auth |
pytest的fixture机制被用来实现测试前置条件:
python复制import pytest
import allure
@pytest.fixture(scope="module")
def setup():
# 初始化测试环境
mock_server.start()
yield
# 清理环境
mock_server.stop()
@allure.story("认证测试")
class TestAuthentication:
@allure.title("测试管理员登录")
def test_admin_login(self, setup):
case = ExcelParser("data/test_cases.xlsx").get_testcases("auth")[0]
response = requests.request(
method=case.method,
url=base_url + case.url,
headers=case.headers,
json=case.params
)
assert response.status_code == 200
assert "token" in response.json()
执行测试并生成报告:
bash复制pytest --alluredir=./reports/raw_results
allure serve ./reports/raw_results
在实际使用中,通过以下指令序列逐步优化项目:
code复制/modify utils/signature.py
- 添加URL编码处理
- 区分空字符串和None值
code复制/enhance utils/excel_reader.py
- 添加文件存在性检查
- 增加单元格格式验证
- 补充类型转换错误处理
code复制/expand mock_server.js
- 添加延迟响应功能
- 支持动态路径参数
- 增加请求验证中间件
通过实测发现三个需要手动优化的地方:
python复制# 在token_manager.py中添加Redis支持
import redis
r = redis.Redis(host='localhost')
def get_cached_token(self, user):
cached = r.get(f"token:{user}")
if cached:
return cached.decode()
return None
python复制# 使用openpyxl的read_only模式处理大文件
def __init__(self, file_path):
self.wb = openpyxl.load_workbook(
file_path,
read_only=True,
data_only=True
)
python复制# pytest.ini中添加并行配置
[pytest]
addopts = -n auto
python_files = test_*.py
在GitHub Actions中配置自动化测试:
yaml复制name: API Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- run: pip install -r requirements.txt
- run: pytest --alluredir=./reports
- uses: actions/upload-artifact@v3
if: always()
with:
name: allure-report
path: ./reports
使用deepdiff进行复杂结果验证:
python复制from deepdiff import DeepDiff
def assert_response(actual, expected):
diff = DeepDiff(
actual,
expected,
ignore_order=True,
exclude_paths=["root['timestamp']"]
)
assert not diff, f"响应不匹配: {diff}"
通过mitmproxy实现:
python复制from mitmproxy import http
def request(flow: http.HTTPFlow) -> None:
if flow.request.pretty_url.startswith(target_domain):
save_to_excel(
path="recorded_cases.xlsx",
request=flow.request,
response=flow.response
)
经过这次实践,我认为TRAE Solo模式特别适合快速原型开发和标准化项目搭建。虽然生成的代码需要一定调整才能达到生产级质量,但它节省了80%以上的基础编码时间。对于需要频繁创建测试项目的团队,这无疑是个革命性的工具。