zoukankan      html  css  js  c++  java
  • Python Api响应验证封装

    基础验证基类

    首先,我们创建一个继承自ABC类的BaseValidator类。因此,我可以创建一个抽象方法。从此类继承的所有类都必须实现验证功能。

    其中有三个魔法函数,__set__()函数在为对象赋值时,自动传入并执行。

    from abc import ABC, abstractmethod
    
    class BaseValidator(ABC):
        @abstractmethod
        def validate(self, value):
            pass
    
        def __init__(self):
            self.value = None
    
        def __get__(self, obj, objtype):
            return self.value
        
        def __set__(self,obj, value):
            self.validate(value)
            self.value = value

    创建验证类

    然后创建了3个验证示例类。String,Integer和OneOf类。

    String类具有最小和最大长度。验证器功能检查新值是否在最小和最大长度之间。

    Integer类具有一个最小参数。验证功能检查新值是否大于此最小参数。

    OneOf类很特殊。它接收可能的(字符串)值列表。验证功能检查新值是否为可能的值之一。

    class OneOf(BaseValidator):
        def __init__(self, values=list()):
            self.values = values
    
        def validate(self, value):
            if not isinstance(value, str):
                raise TypeError(f'{value} should be of type str')
            if not(value in self.values):
                raise ValueError(f'{value} should be one of {self.values}')
    
    class String(BaseValidator):
        def __init__(self, min_len = 8, max_len=12):
            self.min_len = min_len
            self.max_len = max_len
    
        def validate(self, value):
            if not isinstance(value, str):
                raise TypeError(f'{value} should be of type str')
            if len(value) < self.min_len:
                raise ValueError(f'length of {value} should be at least {self.min_len}')
            if len(value) > self.max_len:
                raise ValueError(f'length of {value} should be not bigger than {self.max_len}')
    
    class Integer(BaseValidator):
        def __init__(self, minimum=21):
            self.minimum = minimum
        
        def validate(self, value):
            if not isinstance(value, int):
                raise TypeError(f'{value} should be of type int')
            if value < self.minimum:
                raise ValueError(f'{value} should be at least {self.minimum}')

    构建unittest测试

    这里ReplyValidator和Reply写死了,在实际工作中,可以将验证类对象与数据一起传入Reply,在ReplyValidator中循环实例化对象,并以列表返回,再循环赋值验证。

    import unittest
    
    
    class ReplyValidator(object):
        name = String()
        age = Integer()
        interest = OneOf(["testing", "programming", "agile"])
    
    class Reply():
        def __init__(self, data):
            self.validator = ReplyValidator()
            self.validator.name = data["name"]
            self.validator.age = data["age"]
            self.validator.interest = data["interest"]    
    
    class BaiduTest(unittest.TestCase):
        def setUp(self):
         pass
        
        def test_baidu(self):
            reply_data = dict(name="test",
                        street="testing street",
                        age=34,
                        interest="testing")
    
            reply = Reply(reply_data)
     
    
      def tearDown(self):
          pass
    
    if __name__ == "__main__": 
        unittest.main()
    
    
    
  • 相关阅读:
    Java面试知识点总结
    Log4j常用配置及使用
    Eclipse+tomcat+axis2进行web service部署
    iframe内点击a标签禁止滚动到顶部
    VScode首选项
    Bookmarks
    VScode常用插件
    slideout
    bs-loading
    iPhone X 上删除白条
  • 原文地址:https://www.cnblogs.com/-wenli/p/14194771.html
Copyright © 2011-2022 走看看