目录
一、前置说明
1、总体目录
2、本节目标
- 阐述
pyparamvalidate
项目背景和需求分析。
二、主要内容
1、项目背景
在编写 easyuiautotest
自动化测试框架时,经常需要对用户输入的数据进行校验,并给出错误提示。
下面是一段典型的问题代码:
python
def example_function(name, age, gender='male', **kwargs):
# 校验代码
if not name:
raise ValueError('name is required')
if not age:
raise ValueError('age is required')
if gender not in ['male', 'female']:
raise ValueError("gender must be either 'male' or 'female'")
profile = kwargs.get("profile")
if profile is None:
raise ValueError('profile is required')
address = profile.get("address")
if not address:
raise ValueError("address is required")
# 业务代码
print(name, age, gender, profile)
它的问题是:大量的校验代码与业务代码混在一起,整体显得很杂乱冗余。
所以需要对它进行改造:将普遍的校验行为抽离出来模块化,最小化对业务代码的侵入。
下面是期望的改造效果:
python
@ParamValidator("profile").is_similar_dict(reference_dict={"address": "", "others": {}})
@ParamValidator("gender", "gender must be either 'male' or 'female'").is_allowed("male", "female")
@ParamValidator("age", "age must be integer.").is_integer().is_not_empty()
@ParamValidator("name", "name must be string.").is_string().is_not_empty()
def example_function(name, age, gender='male', **kwargs):
address = kwargs.get("profile").get("address")
Validator(address).is_not_empty('address is required')
# 业务代码
print(name, age, gender, profile)
2、需求分析
从问题与期望中,大致提炼出需求如下:
- 支持对函数参数进行校验,如:
python
@ParamValidator("name", "name must be string.").is_string().is_not_empty()
def example_function(name, age, gender='male', **kwargs):
...
- 支持对一般数据进行校验,如:
python
address = kwargs.get("profile").get("address")
Validator(address).is_not_empty('address is required')
- 提供清晰的错误提示,在字段规则描述或在校验方法中给出错误提示,如:
python
Validator(address, rule_des='address is required').is_not_empty()
Validator(address).is_not_empty('address is required')
- 支持链式调用,方便用户连续调用多个校验方法,如:
python
Validator(address).is_string().is_not_empty()
- 支持用户自定义校验规则,如:
python
def is_even_number(value):
return value % 2 == 0
Validator(input).custom_validator(is_even_number, "Value must be an even number")
3、轮子调研
不重复造轮子,确定需求之后,使用 Chatgpt
做了一个简单的调研,发现有几个强大的校验数据结构的库:
暂未发现支持函数参数校验的现成项目(可能调研不全面),于是决定: do it now
.
从特性出发,因此将项目命名为:pyparamvalidate
.
三、后置说明
1、要点小结
- 数据校验是一个通用行为,可以将其模块化;
do it now
,立即行动,开始实施;
2、下节准备
- Validator 类的简单实现