起因

前两天领导看我摸鱼严重,喊我去做核心业务的接口自动化,从网上看了几篇教程最终决定使用 pytest+yaml 的方案。

经过

因为只做核心业务,一个 case 需要使用几个到十几个接口,所以我将接口信息 (url、header、method、param 等) 放到 yaml 中,用的时候读取出来。
写了几个接口后,感觉身心俱疲,像搬运工一样,把接口信息从 swagger 搬到 yaml 文件。

摸鱼

于是我开始网上冲浪,看看有没有简单一点的办法,可以解决我搬运工困境。
然后被我找到了一个 openapi 转 python client 的项目:https://github.com/openapi-generators/openapi-python-client
试用了下,是我期望的效果,可以将 swagger 转为可以直接调用的代码,官方示例如下:

from {{ package_name }}.models import MyDataModel
from {{ package_name }}.api.my_tag import get_my_data_model
from {{ package_name }}.types import Response

with client as client:
    my_data: MyDataModel = get_my_data_model.sync(client=client)
    # or if you need more info (e.g. status_code)
    response: Response[MyDataModel] = get_my_data_model.sync_detailed(client=client)

使用这个项目会生成直接调用的 api:get_my_data_model
还会生成入参模型: MyDataModel
甚至还有 api 的同步/异步调用,非常 nice👍
但是作为一个新手,我不太喜欢 client 作为传参传入 api 发送请求方法中,我想直接使用 client 调用 api。
于是我开始改改改

最终成果

因为原项目提供了模版替换功能,所以我只需要一点点的变动,就实现了我想要的效果:

# 伪代码
from {{ package_name }}.models import loginDto
from {{ package_name }}.api.login import login
from {{ package_name }} import Client

client = Client(base_url="")
login_resp = client.login.sync_detailed(loginDto(username="admin", password="123456"))
# 直接获取json响应
login_resp = client.login.sync_detailed(loginDto(username="admin", password="123456")).json()

同原项目的区别:

  1. 可以使用 client 直接调用 api,更方便接口测试时使用
  2. 直接返回 httpx.response :https://www.python-httpx.org/quickstart/#response-content

项目地址

欢迎有需求的小伙伴试用:
https://github.com/Renskk/openapi-to-python-client


↙↙↙阅读原文可查看相关链接,并与作者交流