美文网首页
Django—Rest接口测试

Django—Rest接口测试

作者: sandy测试路 | 来源:发表于2022-04-28 05:35 被阅读0次

    1、测试POST接口

    • SnippetList


      image.png
    models.py
    class Snippet(models.Model):
    
        title = models.CharField(max_length=20, blank=True, default='', verbose_name='代码片段标题')
        code = models.TextField()
        linenos = models.BooleanField(default=False)   # 是否显示行号
        created_time = models.DateTimeField(auto_now_add=True)
    
    serializers.py
    from rest_framework import serializers
    from .models import Snippet
    
    class SnippetSerializer(serializers.ModelSerializer):
        class Meta:
            model = Snippet
            # fields指定输出的字段
            fields = ('id', 'title', 'code', 'linenos')
            # extra_kwargs:serializer对post/put数据进行校验
            extra_kwargs = {
                # 反序列化之后保存title到数据库时的格式限制
                'title': {
                    'required': True,
                    'min_length': 2,
                    'max_length': 10,
                    'error_messages': {
                        'required': 'title字段必填',
                        'min_length': '字段太短',
                        'max_length': '字段太长',
                    }
                },
                'code': {
                    'required': True
                },
                'id': {
                    'read_only': True,
                },
            }
    
        # title不允许重复
        def validate_title(self, title):
            if Snippet.objects.filter(title=title).first():
                raise serializers.ValidationError("title已经存在")
            return title
    
    
    views.py
    from rest1020.models import Snippet
    from rest1020.serializers import SnippetSerializer
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.status import HTTP_201_CREATED, HTTP_200_OK, HTTP_400_BAD_REQUEST, HTTP_204_NO_CONTENT, HTTP_404_NOT_FOUND
    
    
    # 列出所有snipptes或者创建一个新的snippet
    class SnippetList(APIView):
    
        def get(self, request):
            snippets = Snippet.objects.all()
            serializer = SnippetSerializer(snippets, many=True)
            serializer_data = serializer.data
            return Response(serializer_data, status=HTTP_200_OK)
    
        def post(self, request):
            # print(type(request))   # <class 'rest_framework.request.Request'>
            # print(type(request.data))  # dict类型
            serializer = SnippetSerializer(data=request.data)
            # 参数校验 
            if serializer.is_valid():
                # title名称不允许重复
                if serializer.validate_title(request.data['title']):
                    serializer.save()
                    return Response(serializer.data, status=HTTP_201_CREATED)
            return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
    
    测试结果

    1、title不传递时,报错400


    image.png

    2、title传递但长度不符合规定时,报错400


    image.png

    3、title为空字符串


    image.png

    4、title名称已经存在


    image.png

    5、title符合规则,请求成功


    image.png
    改写views.py使用serializer.is_valid(raise_exception=True)
    • views.py
        def post(self, request):
            serializer = SnippetSerializer(data=request.data)
            if serializer.is_valid(raise_exception=True):
                serializer.save()
                return Response(serializer.data, status=HTTP_201_CREATED)
            return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
    
    • 接口测试:title名称已经存在


      image.png
    image.png

    2.测试 PUT接口

    • SnippetDetail


      image.png

    1、对象不存在时的处理:返回体:提示用户不存在,状态:422

    3、测试GET接口

    • 对象不存在时的处理:
    1. 返回体:空,状态:200
    2. 返回体:提示用户不存在,状态:422

    4. 自定义Response结构体

    5、使用generics通用视图

    • 使用generics通用视图后,API页面端点会显示有2种
    • 有Raw data和HTML form两种格式


      HTML form格式
      Raw data格式

    相关文章

      网友评论

          本文标题:Django—Rest接口测试

          本文链接:https://www.haomeiwen.com/subject/ukkzmktx.html