三十九、实战演练之接口自动化平台的测试场景步骤接口设计

一、测试场景步骤创建

接口名称: /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扩展

  1. 测试场景步骤排序接口和测试场景步骤强相关,单独创建一个视图会有很多重复代码,且逻辑接口不严谨。如果能把这个接口也定义在测试场景步骤视图集中则更加的简介和符合逻辑。
  2. drf中的视图集除了标准的请求处理方法外,还可以定义额外的处理方法,并通过 action 装饰器自动添加路由。
  3. 在测试场景步骤视图集中添加如下方法:
  4. 与标准处理方法一样,额外定义的方法可以针对单个对象或整个集合。参数 detail 设置为True时表示针对单个对 象,这时生成的路由中会包含 pk 。
  5. 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) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值