Pytest:yield的简单使用(方法执行后的数据处理)

在基于 Pytest 框架编写接口自动化用例时,遇到了这样的一个场景:

1、我需要编写一个「根据用户id查信息」的接口

2、在执行这条用例之前,我准备了一个 fixture 方法用来「新增用户」

3、我现在有一个需求是:在执行完「根据用户id查信息」的接口后,自动将「新增用户」创建的用户自动删除,防止脚本造成垃圾数据

4、于是我把目光转到了「yield」方法:使用 yield 替代 return,并在yield 后添加需要执行的方法


一、首先创建文件,使用 Flask 来 mock 三个接口Api【记得Run起来】

# -*- -*- -*-  -*-  -*-  -*-  -*-  -*-  
# -*- coding: utf-8 -*-
#  @文件名称 : mock_api.py
#  @创 建 者 : PythonKimo
# -*- -*- -*-  -*-  -*-  -*-  -*-  -*-
# coding=gbk
from flask import request, Flask, jsonify

app = Flask(__name__)

@app.route('/api/v1/addUser', methods=['POST']) 
def addUser():
    return jsonify({
        "code": 1,
        "msg": "用户新增成功",
        "data": {
            "id": 1,
            "name": "张三",
            "sex": "男",
            "age": 18,
            "loginId": "test"
        }
    })

@app.route('/api/v1/getUserInfo', methods=['GET'])
def getUserInfo():
    return jsonify({
        "code": 1,
        "msg": "用户信息查询成功",
        "data": {
            "id": 1,
            "name": "张三",
            "sex": "男",
            "age": 18,
            "loginId": "test"
        }
    })

@app.route('/api/v1/deleteUser', methods=['DELETE'])
def deleteUser():
    return jsonify({
        "code": 1,
        "msg": "用户删除成功"
    })

if __name__ == '__main__':
    app.run( host='127.0.0.1')

二、模拟调用mock好的三个 Api 接口

  1. 一开始我的代码是:在查询完用户信息后再次调用删除的接口
    在这里插入图片描述

  2. 发现局限性太大,因为我还需要写「修改用户」,就需要再次Ctrl + C + V,所以使用 yield 对代码做了一些调整

    # -*- coding: utf-8 -*- 
    # @Time      :  2022/7/25 13:17
    # @Author    :  PythonKimo
    # @File      :  yield_study.py
    # @Desc      :  
    # -*- -*- -*- -*- -*- -*-
    import pytest
    import requests
    
    @pytest.fixture(scope="function")
    def user_id():
        url = "http://127.0.0.1:5000/api/v1/addUser"
        headers = {"Content-Type": "application/json"}
        data = {
            "name": "张三",
            "sex": "男",
            "age": 18,
            "loginId": "test"
        }
        res = requests.request("post", url=url, headers=headers, json=data)
        assert res.json()["msg"] == "用户新增成功"
        userId = res.json()["data"]["id"]
        # return userId
        yield userId # 将 return 替换为 yield
    
        # yield 下方的接口调用,可作为 teardown 方法实现功能
        url = "http://127.0.0.1:5000/api/v1/deleteUser"
        data = {
            "id": userId
        }
        res = requests.request("delete", url=url, headers=headers, json=data)
        assert res.json()["msg"] == "用户删除成功"
    
    class TestUser:
    
        def test_query_user_info_by_id(self,user_id):
            url = "http://127.0.0.1:5000/api/v1/getUserInfo"
            headers = {"Content-Type": "application/json"}
            data = {
                "id": user_id
            }
            res = requests.request("get", url=url, headers=headers, params=data)
            assert res.json()["msg"] == "用户信息查询成功"
    

    在这里插入图片描述

  3. 再次执行方法,使用 debug 模式打断点,就可以发现:
    ① 首先执行 fixture 中的 user_id 方法,并返回生成的用户id
    ② 然后代码开始执行「test_query_user_info_by_id」方法
    ③ 执行完毕后,此时代码进入 yield 下方的方法,调用删除用户接口

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值