接口自动化之测试数据动态生成并替换

发布时间 2023-03-31 12:10:17作者: 奈非天

一、测试数据

1. 随机库random

查看内置random方法,该方法自行学习,不再介绍。

show
print([name for name in dir(random) if callable(getattr(random, name))])

['Random', 'SystemRandom', '_Sequence', '_Set', '_accumulate', '_acos', '_bisect', '_ceil', '_cos', '_exp', '_floor', '_log', '_repeat', '_sha512', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randbytes', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
 

 

2. Faker库

pip install faker

Https://github.com/joke2k/faker

show
from faker import Faker
f = Faker(locale='Zh-CN')

def random_string():
    """
    :return:随机生成字符串,20位
    """
    return f.pystr()


def random_ssn():
    """
    :return:随机生成省份中
    """
    return f.ssn()


def random_phone(self) -> int:
    """
    :return: 随机生成手机号码
    """
    return f.phone_number()


def random_id_card(self) -> int:
    """

    :return: 随机生成身份证号码
    """

    return f.ssn()


def random_female_name(self) -> str:
    """

    :return: 女生姓名
    """
    return f.name_male()


def random_male_name(self) -> str:
    """

    :return: 男生姓名
    """
    return f.name_female()

def random_email() -> str:
    """

    :return: 生成邮箱
    """
    return f.email()

def random_int():
    """随机生成 0 - 9999 的数字"""
    return f.random_int()

3. 应用到项目中

3.1 思路

  1. 在用例数据中添加标志位,设计这个标志位为

    {{特殊的变量名}}

    ,例如生成手机号码的标志位为

    {{ phone_number }}
    • 什么字段里有可能有这个标志

      • request_data

      • sql

      • url

      • header
      • expected
  2. 检查用例数据,如果出现了标志则动态生成对应数据并替换

3.2 用例数据修改

def replace_dependent_parameter(self, jst):
        """
        替换字符串中的关联参数,并返回转化后的字典格式。
        Args:
            jst: 包含接口参数的字符串
        Returns:转换后的字典或原始字符串
        """
        if not jst:
            return jst
        jst = json.dumps(jst) if isinstance(jst, (dict, list)) else jst
        # 替换
        while self.PATTERN.search(jst):
            key = self.PATTERN.search(jst).group()
            # 字符串替换
            if key in self.dependence.keys():
                jst = jst.replace(key, str(self.get_dependent_value(key)))
                logger.my_log(f"key:{key},替换成功:{self.get_dependent_value(key)}")
            else:
                logger.my_log(f"key:{key},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常\n")
                break
                jst = jst.replace("True", "true").replace("False", "false")
        if self.pattern.search(jst):
            try:
                jst = json.loads(jst)
            except json.JSONDecodeError as e:
                logger.my_log(f"JSONDecodeError:{jst}:{e}")

        return jst