(二)零代码封装pytest框架(接口关联)

接口关联处理的两大步骤

一、提取变量

1、提取变量的两种方式

(1)正则提取

re.findall(pattern, string, flags=0)

pattern :指定的正则表达式模式。
**string :**要搜索的字符串。
flags :可选参数,用于控制匹配的模式,如忽略大小写、多行模式等。

re.findall() 函数是 Python 中正则表达式库 re 提供的一个强大的函数,用于在字符串中查找所有与正则表达式模式匹配的子。

作用:该函数扫描会整个字符串,返回一个列表,其中包含字符串中所有与正则表达式模式匹配的子串。如果正则表达式中包含组(即用括号括起来的部分),则返回的列表中每个元素是一个元组,元组中的每个元素对应一个组的匹配结果。

(2)jsonpath提取

import jsonpath

# 假设有一个 JSON 数据
data = {
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}

# 使用 jsonpath.jsonpath() 提取数据
# 提取所有书籍的作者
authors = jsonpath.jsonpath(data, '$.store.book[*].author')
print(authors)  # 输出: ['Nigel Rees', 'Evelyn Waugh']

常见用法

  • 提取对象属性:使用点号 . 来访问对象的属性。

    • $.store.bicycle.color 提取自行车的颜色。

  • 提取数组元素:使用 [*] 来提取数组中的所有元素。

    • $.store.book[*].title 提取所有书籍的标题。

  • 条件过滤:使用 ?(@.property operator value) 来过滤满足条件的元素。

    • $.store.book[?(@.price < 10)] 提取价格小于 10 的书籍。

  • 通配符:使用 * 作为通配符来匹配任意属性或元素。

    • $..book 匹配文档中所有名为 book 的元素。

2、提取变量的地方

        一般在响应的结果中、cookie中、响应头中...........

        通过这两个方法提取变量后通过下标取值

3、如何去设计提取方式

在yaml文件中使用这种方式去设计:

extract:

        保存变量的值: [取值的地方, 取值的方式, 取值的下标]

-
  feature: 常规网站
  story: 用户登录接口
  title: 用户登录
  request:
    method: post
    url: www.baidu.com
    headers:
      Content-Type: application/x-www-form-urlencoded;charset=UTF-8
    data:
      user_name: test01
      passwd: admin123
  extract:
    token: [json,"$.token",0]

4、通过上面这种设计方法我们可以这么做

在common下建立extract_util.py提取工具模块

根据extract:

        保存变量名: [取值的地方, 取值的方式, 取值的下标]

第一步:我们设计一个方法,传(响应、变量名、取值名、取值表达式、下标)将最后得到的值放到extract.yaml文件中

class ExtractUtil:

    # 提取变量
    def extract(self, res, var_name, attr_name, expr, index):
        # 深拷贝
        new_res = copy.deepcopy(res)
        # 把json()方法改成json属性
        try:
            new_res.json = new_res.json()
        except Exception:
            new_res.json = {"msg": "response is not json data"}
        # 通过反射获取属性的值
        data = getattr(new_res, attr_name)
        # 判断用什么方式去提取
        if expr.startswith("$"):
            lis = jsonpath.jsonpath(dict(data), expr)
        else:
            lis = re.findall(expr, data)
        # 通过下标取值
        if lis:
            write_yaml({var_name: lis[index]})

第二步:因为我们更改了yaml用例,一定得将yaml_model_util.py中类下加入选填的extract

@dataclass
class CaseInfo:
    # 必填
    feature: str
    story: str
    title: str
    request: dict
    validate: dict
    # 选填
    extract: dict = None

第三步:在发送请求之后得到响应才能去提取变量,通过判断yaml中是否存在extract,有则进行提取操作。

# 请求响应之后去提取接口关联变量
if case_obj.extract:
    for key, value in case_obj.extract.items():
        eu.extract(res, key, *value)

二、使用变量

在postman中使用变量通常是:{{变量名}}

jmeter中使用变量通常是:${变量名}

根据提取变量的设计使用jmeter这种模式:${变量名}

使用的地方一般在请求四要素中,因此在yaml文件中应该这么去使用

data:
  token:${token}

根据上述使用规则(选取替换规则)

第一种:data_str.replace()

第二种:Template模板替换,能替换${变量名}内的值

data = Template("you name is ${name}")
print(data.substitute(name = "OY"))   # you name is OY

因此使用第二种替换方法。

发送请求前去使用替换。编写使用提取的值的方法。

# 在ExtractUtil类下    

    # 使用变量
    def use_extract_value(self, data: dict):
        # 把字典转换成字符串
        data_str = yaml.safe_dump(data)
        # 字符串替换,替换${变量名}的值
        new_request_data = Template(data_str).safe.substitute(read_all())
        # 把字符串转换成字典
        data_dict = yaml.safe_load(new_request_data)
        return data_dict
# 在test_all_case.py发送请求前使用替换变量方法

    # 使用提取的值,赋值给四要素中为,${变量}
    new_request = eu.use_extract_value(new_caseinfo.request)

三、整体代码如下:

common下的extract_util.py

 common下 yaml_util.py中读取extract.yaml所有字典的方法

 testcase下的test_all_case.py的整体代码

### pytest Framework Beginner Tutorial #### 安装 Pytest 为了开始使用 `pytest` 进行测试,首先需要安装该库。可以通过 pip 来轻松完成此操作[^1]。 ```bash pip install pytest ``` #### 创建简单的测试文件 创建一个名为 `test_sample.py` 的文件,在其中编写如下代码: ```python def inc(x): return x + 1 def test_answer(): assert inc(3) == 4 ``` 这段代码定义了一个函数 `inc()` 和一个以 `test_` 开头的方法来验证这个简单加法运算的结果是否正确。注意所有的测试方法名都应以单词 "test_" 开始以便被自动识别为测试案例。 #### 执行测试命令 打开终端并导航到包含上述 Python 文件的目录下运行下面这条指令: ```bash pytest ``` 这将会执行所有匹配模式 `test_*` 的测试用例,并显示成功或失败的信息给用户查看。对于更详细的输出可以加上 `-v` 参数获得更加详尽的日志报告。 #### 断言功能介绍 PyTest 提供了非常强大而简洁断言语句支持, 只需利用内置关键字 `assert`, 后面跟上期望成立条件即可实现基本判断逻辑。当表达式的计算结果不满足预期时,则会抛出 AssertionError 并终止当前测试过程。 #### 测试类结构化组织 除了单独写多个独立的小型单元检验外还可以通过面向对象的方式把一系列有关联性的检查封装在一个 Test Class 中,这样有助于提高可读性和维护效率。需要注意的是此类的名字也应当遵循特定命名约定即首字母大写的前缀 “Test”。 ```python class TestClassDemoInstance: value = 0 def test_one(self): self.value = 1 assert self.value == 1 def test_two(self): self.value = 2 assert self.value == 2 ``` 以上例子展示了如何构建一个带有两个成员属性以及相应校验规则的对象实例来进行批量处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OY-xin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值