一、测试用例接口管理
POST 创建测试步骤
POST /test_steps/
Body 请求参数
{
"title": "登录成功",
"headers": {},
"request": {},
"file": [],
"setup_script": "# 前置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"teardown_script": "# 后置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# response:响应对象response \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"interface": 1
}
请求参数
名称 | 位置 | 类型 | 必选 | 说明 |
body | body | object | 否 | none |
» title | body | string | 是 | none |
» headers | body | object | 否 | none |
» request | body | object | 否 | none |
» file | body | [string] | 否 | none |
» setup_script | body | string | 否 | none |
» teardown_script | body | string | 否 | none |
» interface | body | integer | 是 | none |
返回示例
成功
{
"id": 1,
"title": "登录成功",
"headers": {},
"request": {},
"file": [],
"setup_script": "# 前置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"teardown_script": "# 后置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# response:响应对象response \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"interface": 1
}
返回结果
状态码 | 状态码含义 | 说明 | 数据模型 |
201 | 成功 | Inline |
返回数据结构
GET 查看测试步骤列表
GET /test_steps/
请求参数
名称 | 位置 | 类型 | 必选 | 说明 |
scene | query | integer | 否 | none |
interface | query | integer | 否 | none |
返回示例
成功
[
{
"id": 1,
"title": "登录成功",
"headers": {},
"request": {},
"file": [],
"setup_script": "# 前置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"teardown_script": "# 后置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# response:响应对象response \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"interface": 1
}
]
返回结果
状态码 | 状态码含义 | 说明 | 数据模型 |
200 | 成功 | Inline |
返回数据结构
DELETE 删除测试用例
DELETE /test_steps/{id}/
请求参数
名称 | 位置 | 类型 | 必选 | 说明 |
id | path | string | 是 | none |
返回示例
204 Response
{}
返回结果
状态码 | 状态码含义 | 说明 | 数据模型 |
204 | 删除成功 | Inline |
返回数据结构
PUT 修改测试步骤
PUT /test_steps/{id}/
Body 请求参数
{
"title": "登录成功",
"headers": {},
"request": {},
"file": [],
"setup_script": "# 前置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"teardown_script": "# 后置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# response:响应对象response \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"interface": 1
}
请求参数
名称 | 位置 | 类型 | 必选 | 说明 |
id | path | string | 是 | none |
body | body | object | 否 | none |
» title | body | string | 是 | none |
» headers | body | object | 否 | none |
» request | body | object | 否 | none |
» file | body | [string] | 否 | none |
» setup_script | body | string | 否 | none |
» teardown_script | body | string | 否 | none |
» interface | body | integer | 是 | none |
返回示例
删除成功
{
"id": 1,
"title": "登录成功",
"headers": {},
"request": {},
"file": [],
"setup_script": "# 前置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"teardown_script": "# 后置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# response:响应对象response \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"interface": 1
}
返回结果
状态码 | 状态码含义 | 说明 | 数据模型 |
204 | 删除成功 | Inline |
返回数据结构
GET 查看测试步骤
GET /test_steps/{id}/
请求参数
名称 | 位置 | 类型 | 必选 | 说明 |
id | path | string | 是 | none |
返回示例
成功
{
"id": 1,
"interface": {
"id": 1,
"steps": [
{
"id": 1,
"title": "登录成功"
}
],
"name": "登录",
"url": "/users/login/",
"method": "POST",
"type": "1",
"project": 1
},
"title": "登录成功",
"headers": {},
"request": {},
"file": [],
"setup_script": "# 前置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n",
"teardown_script": "# 后置脚本(python):\n# global_tools:全局工具函数\n# data:用例数据 \n# response:响应对象response \n# env: 局部环境\n# ENV: 全局环境\n# db: 数据库操作对象\n"
}
返回结果
状态码 | 状态码含义 | 说明 | 数据模型 |
200 | 成功 | Inline |
二、后端代码
2.1 模型
from django.db import models
# Create your models here.
setup_script = """# 前置脚本(python):
# global_tools:全局工具函数
# data:用例数据
# env: 局部环境
# ENV: 全局环境
# db: 数据库操作对象
"""
teardown_script = """# 后置脚本(python):
# global_tools:全局工具函数
# data:用例数据
# response:响应对象response
# env: 局部环境
# ENV: 全局环境
# db: 数据库操作对象
"""
class TestStep(models.Model):
"""用例表"""
title = models.CharField(max_length=50, help_text='用例名称', verbose_name='用例名')
interface = models.ForeignKey('projects.Interface', on_delete=models.CASCADE, help_text='接口',
verbose_name='接口verbose_name',
)
headers = models.JSONField(help_text='请求头', verbose_name='请求头', default=dict, blank=True)
request = models.JSONField(help_text='请求信息', verbose_name='请求信息', default=dict, blank=True)
file = models.JSONField(help_text='上传的文件参数', verbose_name='上传的文件', default=list, blank=True)
setup_script = models.TextField(help_text='前置脚本', verbose_name='前置脚本', default=setup_script, blank=True)
teardown_script = models.TextField(help_text='后置脚本', verbose_name='用例后置脚本', default=teardown_script,
blank=True)
def __str__(self):
return self.title
class Meta:
db_table = 'tb_test_step'
verbose_name = "测试步骤表"
verbose_name_plural = verbose_name
2.2 序列化器
from rest_framework.serializers import ModelSerializer
from projects.serializers import InterfaceSerializer, NestTestStepSerializer
from . import models
from .models import TestStep
class TestStepSerializer(ModelSerializer):
class Meta:
model = models.TestStep
fields = '__all__'
class TestStepRetrieveSerializer(ModelSerializer):
# 这是做了一个嵌套,且属性名应该是模型类名的小写,如:interface
interface = InterfaceSerializer(read_only=True)
class Meta:
model = TestStep
fields = '__all__'
2.3 视图
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from . import serializers
from . import models
# Create your views here.
class TestStepViewSet(ModelViewSet):
queryset = models.TestStep.objects.all()
serializer_class = serializers.TestStepSerializer
# 当一个视图集中,不同的请求方法需要使用不同的序列化器时,那么需要改写get_serializer_class方法
def get_serializer_class(self):
if self.action == 'retrieve':
return serializers.TestStepRetrieveSerializer
return super().get_serializer_class()
注意:
后端中self.action
对应http方法:
self.action | http |
list | get |
create | post |
update、partial_update | put、patch |
delete | delete |
retrieve | get |
2.4 路由
from rest_framework.routers import DefaultRouter
from .views import TestStepViewSet
route = DefaultRouter()
route.register('test_steps', TestStepViewSet)
urlpatterns = route.urls