9.测试用例执行
大约 3 分钟学习笔记测试平台开发
一、 序列化器中的类属性字段
序列化 中所定义的 类属性 字段,一般情况下与 模型类 字段 相对应
默认情况下,这些类属性字段既可以进行序列化输出,也可以进行反序列化输入
不需要输入(反序列化)、输出(序列化)的字段,则不需要定义,定义的字段 则必须出现在 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() 方法来校验入参。
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 instanceclass 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