大家好~我是
米洛
!
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程
,希望大家多多支持。
欢迎关注我的公众号米洛的测开日记
,获取最新文章教程!
# 回顾
上一节我们只捋了捋思路,并且迁移了一下枚举类以及制定了2个schema,这节我们就来完善剩下的。
# 完善CaseGenerator
记得我们之前编写的CaseGenerator类吗,里面包括了RequestInfo生成,但还没有case生成部分。
由于我们的case是由CASE主体
以及Constructors
,断言
等组成,而我们默认是不带断言的,所以我们只需要生成case主体和构造方法即可。
获取bodyType
由于录制case的时候,我们根本不知道用户是什么请求类型,所以我们直接拿到RequestInfo数组的最后一个元素,根据里面Content-type来判断用例是什么类型。
- 生成case主体
我这里固定好了用例名称为录制用例
+对应的时间戳(防止重复),但其实后续我们会进一步升级,让用户生成用例的时候有一些选项。
接着我们给一些用例的初始值,得到最终这个结果。
- 生成constructors
@staticmethod
def generate_constructors(requests: List[RequestInfo]) -> List[ConstructorForm]:
constructors = []
for r in range(len(requests) - 1):
name = f"http请求_{r + 1}"
constructor_json = json.dumps(dict(
body=requests[r].body,
headers=requests[r].request_headers,
base_path=None,
url=requests[r].url,
request_method=requests[r].request_method,
body_type=CaseGenerator.get_body_type(requests[r].request_headers),
), ensure_ascii=False)
c = ConstructorForm(name=name, value=f"http_res_{r + 1}", constructor_json=constructor_json,
enable=True, public=True, suffix=False, index=r + 1,
type=ConstructorType.http.value)
constructors.append(c)
return constructors
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
代码比较简单,我们只遍历到request的N-1条数据,并把body等参数读取出来,成为一个constructor_json,最后生成一个ConstructorForm(这样能复用之前的新增用例方法)。
至于前置条件的一些是否公开
,共享
等属性也默认打开了,这个其实无所谓,毕竟用例生成了以后都是可以改的
。
- 编写生成用例接口
@router.post("/generate", summary="生成用例")
async def generate_case(form: TestCaseGeneratorForm, user=Depends(Permission()), session=Depends(get_session)):
if len(form.requests) == 0:
return PityResponse.failed("无http请求,请检查参数")
// 提取字段,更新数据
CaseGenerator.extract_field(form.requests)
cs = CaseGenerator.generate_case(form.directory_id, form.requests[-1])
constructors = CaseGenerator.generate_constructors(form.requests)
info = TestCaseInfo(constructor=constructors, case=cs)
async with session.begin():
ans = await TestCaseDao.insert_test_case(session, info, user['id'])
return PityResponse.success(ans)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 前端部分
前端部分我们之前展示了具体生成的用例数据,这次的改动主要是以下2点:
- 录制完后的表格数据要可以选择,不然录制到乱七八糟的,会影响用例生成
- 生成用例后要可以给出链接跳转到对应的用例查看页
话不多说,开造。
- service层 调用生成用例接口
// 生成用例
export async function generateCase(data) {
return request(`${CONFIG.URL}/testcase/generate`, {
headers: auth.headers(),
data,
method: 'POST'
});
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- model层
- jsx
调用生成case接口,接着我们先强制
给一个directory_id=5,然后把选中的接口参数转换一下,发送给后端,最后拿到用例id即可。
整体流程就是上述这样了,我们最后来看一个图。