测试用例执行

一、 序列化器中的类属性字段

序列化 中所定义的 类属性 字段,一般情况下与 模型类 字段 相对应

默认情况下,这些类属性字段既可以进行序列化输出,也可以进行反序列化输入

不需要输入(反序列化)、输出(序列化)的字段,则不需要定义,定义的字段 则必须出现在 fields列表中

只需要反序列化输入,则定义 write_only = True

只需要序列化输出,则定义 read_only = True

响应的参数如果是多个查询集,需要在 JsonResponse() 中传参 many=True

  • label:当前字段在前端的api页面中所显示的字段名称
  • allow_null = False:当前字段是否允许传None,默认是False(必填字段False,反之则True)
  • allow_blank = False:当前字段是否运行为空,默认是False(必填字段False,反之则True)
  • required=False:当前字段允许不传,默认是True(必填字段True,反之则False)

二、反序列化_校验机制

调用序列化器对象的 is_valid() 方法,校验前端参数的正确性,不调用则不校验

校验成功 返回True、校验失败 返回False

is_valid(raise_exception = True):校验失败后,则抛出异常

当调用 is_valid() 之后,才能 调用 序列化器对象的 errors 属性,内容为校验的错误提示(dict)

views.py 中,如果传参进行了输入反序列化的话,那么需要调用的是经过校验后的数据,

比如说 :新增数据,应该是:xxx类.objects.create(**serializer.validated_data)

在视图集(ViewSet)中,REST 都默认调用了 is_valid() 方法来校验入参。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class CaseSerializer(serializers.ModelSerializer):
# config 字段为 Config 序列化器 , REST 会自动提取
config = ConfigSerializer()
# many=True 表示以列表形式展现, read_only=True 表示该字段只用在输出上, write_only=True 只用于输入
teststeps = StepSerializer(many=True, required=False)
project_id = serializers.CharField(write_only=True)
# 格式化输出时间
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)

class Meta:
model = Case
fields = ['config', 'teststeps', 'decs', 'project_id', 'file_path', 'create_time', 'update_time']

def create(self, validated_data): # 经过校验过后的参数 --- 字典形式
# 创建 Config---获取创建 config 的数据
config_kws = validated_data.pop('config')
# 获取项目
project = Project.objects.get(pk=validated_data['project_id'])
config = Config.objects.create(project=project, **config_kws) # 注意关联 project
# 创建 case
# 用例文件名 = 项目名_用例名.json
file_path = f'{project.name}_{config.name}.json'
self.instance = Case.objects.create(config=config, file_path=file_path)
# 返回当前实例对象 --- 模型对象
return self.instance

def update(self, instance, validated_data):
# 更新 config
config_kws = validated_data.pop('config')
# 从入参拿到 project id
project = Project.objects.get(pk=validated_data['project_id'])
# 调用序列化器来更新 config
conf_serializer = ConfigSerializer(instance=instance.config, data=config_kws)
if conf_serializer.is_valid(): # 如果入参合法就更新数据
conf_serializer.save()
else:
# 错误信息包含在 conf_serializer.error
raise ValidationError(conf_serializer.errors)

# 更新步骤
steps_kw = validated_data.pop('teststeps')
for kw in steps_kw:
kw['belong_case_id'] = instance.id # 让步骤关联当前测试用例
ss = StepSerializer(data=kw) # 序列化器更新或创建步骤数据
if ss.is_valid():
ss.save()
else:
raise ValidationError(ss.errors)


# 更新用例主体
instance.file_path = validated_data['file_path']
instance.desc = validated_data['desc']
instance.save() # 调用数据对象的 save 方法保存到数据库
return instance
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class StepSerializer(serializers.ModelSerializer):
testrequest = RequestSerializer()
belong_case_id = serializers.IntegerField(write_only=True, required=False)
class Meta:
model = Step
fields = ['name', 'variables', 'testrequest', 'extract', 'validate', 'teardown_hooks', 'setup_hooks', 'belong_case_id']

def create(self, validated_data):
# 创建请求
request_kws = validated_data['request']
serializer = RequestSerializer(data=request_kws)
if serializer.is_valid():
request_obj = serializer.save()
else:
raise ValidationError(serializer.errors)

# 创建步骤
self.instance = Step.objects.create(testrequest=request_obj, **validated_data) # 关联 request
return self.instance