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 接口
-
一开始我的代码是:在查询完用户信息后再次调用删除的接口
-
发现局限性太大,因为我还需要写「修改用户」,就需要再次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"] == "用户信息查询成功"
-
再次执行方法,使用 debug 模式打断点,就可以发现:
① 首先执行 fixture 中的 user_id 方法,并返回生成的用户id
② 然后代码开始执行「test_query_user_info_by_id」方法
③ 执行完毕后,此时代码进入 yield 下方的方法,调用删除用户接口