一、测试场景步骤创建
接口名称: /test_scene_steps/
请求方式: POST
参数格式: JSON
请求参数:
参数 | 变量名 | 类型 | 说明 | 是否必传 |
测试步骤id | step | 整数 | 测试步骤id | 是 |
测试场景id | scene | 整数 | 测试场景id | 是 |
执行顺序 | sort | 整数 | 执行顺序 | 是 |
请求示例: json格式参数
{
"sort": 2,
"step": 1,
"scene": 1
}
返回示例
响应状态码:201
响应数据:
{
"id": 1,
"stepInfo": {
"id": 1,
"title": "登录成功"
},
"sort": 2,
"step": 1,
"scene": 1
}
二、 删除测试场景步骤
接口名称: /test_scene_steps/id/
请求方式: DELETE
参数格式: 路径参数
请求参数: 无
返回示例
响应状态码:204
响应数据:无
三、修改测试场景步骤
接口名称: /test_scene_steps/id/
请求方式: PUT/PATCH
参数格式: JSON
请求参数:
请求示例:
json格式参数
{
"sort": 2,
"step": 1,
"scene": 1
}
返回示例
响应状态码:200
响应数据:
{
"id": 1,
"stepInfo": {
"id": 1,
"title": "登录成功"
},
"sort": 2,
"step": 1,
"scene": 1
}
四、 查看测试场景步骤列表
接口名称: /test_scene_steps/
请求方式: GET
参数格式: url参数
请求参数:
参数 | 变量名 | 类型 | 说明 | 是否必传 |
测试场景id | scene | 整数 | 页码 | 否 |
返回示例
响应状态码:200
响应数据:
[
{
"id": 1,
"stepInfo": {
"id": 1,
"title": "登录成功"
},
"sort": 2,
"step": 1,
"scene": 1
},
{
"id": 2,
"stepInfo": {
"id": 2,
"title": "登录失败"
},
"sort": 1,
"step": 2,
"scene": 1
}
]
五、查看测试场景步骤
接口名称: /test_scene_steps/id/
请求方式: GET
参数格式: 路径参数
请求参数:无
返回示例
响应状态码:200
响应数据:
{
"id": 1,
"stepInfo": {
"id": 1,
"title": "登录成功"
},
"sort": 2,
"step": 1,
"scene": 1
}
六、测试场景步骤排序
接口名称: /test_scene_steps/order/
请求方式: PUT/PATCH
参数格式: JSON
请求参数:
参数 | 变量名 | 类型 | 说明 | 是否必传 |
测试步骤id | step | 整数 | 测试步骤id | 是 |
测试场景id | scene | 整数 | 测试场景id | 是 |
执行顺序 | sort | 整数 | 执行顺序 | 是 |
请求示例:
json格式参数
[{"id":1,"stepInfo":{"id":1,"title":"登录成功"},"sort":1,"step":1,"scene":1},
{"id":2,"stepInfo":{"id":2,"title":"登录失败"},"sort":2,"step":2,"scene":1},
{"id":3,"stepInfo":{"id":1,"title":"登录成功"},"sort":3,"step":1,"scene":1},
{"id":4,"stepInfo":{"id":2,"title":"登录失败"},"sort":4,"step":2,"scene":1}]
1返回示例
响应状态码:200
响应数据:
[{"id":1,"stepInfo":{"id":1,"title":"登录成功"},"sort":1,"step":1,"scene":1},
{"id":2,"stepInfo":{"id":2,"title":"登录失败"},"sort":2,"step":2,"scene":1},
{"id":3,"stepInfo":{"id":1,"title":"登录成功"},"sort":3,"step":1,"scene":1},
{"id":4,"stepInfo":{"id":2,"title":"登录失败"},"sort":4,"step":2,"scene":1}]
七、后端代码
1. 序列化器
class NestTestStepSerializer(serializers.ModelSerializer):
"""嵌套测试步骤序列化器"""
class Meta:
model = TestStep
fields = ['id', 'title']
class TestSceneStepSerializer(serializers.ModelSerializer):
"""场景步骤序列化器"""
stepInfo = NestTestStepSerializer(source='step', read_only=True)
class Meta:
model = SceneData
fields = '__all__'
2. 视图集action扩展
- 测试场景步骤排序接口和测试场景步骤强相关,单独创建一个视图会有很多重复代码,且逻辑接口不严谨。如果能把这个接口也定义在测试场景步骤视图集中则更加的简介和符合逻辑。
- drf中的视图集除了标准的请求处理方法外,还可以定义额外的处理方法,并通过 action 装饰器自动添加路由。
- 在测试场景步骤视图集中添加如下方法:
- 与标准处理方法一样,额外定义的方法可以针对单个对象或整个集合。参数 detail 设置为True时表示针对单个对 象,这时生成的路由中会包含 pk 。
- action 装饰器默认路由请求为 GET ,也可以通过设置 methods 参数接受其他HTTP方法。 也可以覆盖任何视图级别的配置,例如 permisson_classes , srializer_class , filter_backends 等等:
@action(methods=['put'], detail=False)
def order(self, request, format=None):
...
@action(methods=['POST'], detail=True, permission_classes=[IsAuthenticated])
def run(self, requst, pk):
...
3. 视图
class TestSceneStepViewSet(ModelViewSet):
queryset = SceneData.objects.all().order_by('sort')
serializer_class = TestSceneStepSerializer
permission_classes = [IsAuthenticated]
filterset_fields = ['scene']
# order方法是实际的视图方法,写法跟普通的类试图中视图方法写法一致
# 装饰器action需要修饰整个额外的方法
# 其中参数mathods接受的是列表,表示要处理的http请求方法
# 额外的方法会自动生成路由,默认情况会使用方法的名称
# 例如:/test_scene_steps/order
# 1.当detail=False时会生成/test_scene_steps/order 表示要处理查询集
# 2.当detail=True时会生成/test_scene_steps/<int:pk>/order 表示要处理单个对象
# 自定义url路径,使用url_path参数,会代替方法名
# url_name参数是修改url默认的名字,默认的名字是小写模型名_方法名
@action(methods=['put'], detail=False, )
def order(self, request, *args, **kwargs):
"""排序接口"""
objs = []
for item in request.data:
obj = SceneData.objects.get(pk=item['id'])
obj.sort = item['sort']
obj.save() # 单独保存,推荐
# objs.append(obj)
# SceneData.objects.abulk_update(objs, ['sort']) # 批量保存
return Response(request.data)
添加了一个action用来进行排序
4. 路由
route.register('test_scene_steps', views.TestSceneStepViewSet)