You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python(Graphene)中指定/导入GraphQL Schema?API测试库求助

解决Python GraphQL测试工作台的两个核心问题

我来帮你搞定这两个问题,刚好之前我在团队里也搭建过类似的Python测试环境,分享下可行的方案:

一、无需本地Schema即可编写并执行GraphQL查询

其实完全不需要依赖本地Schema就能给你的Java GraphQL服务器发查询,推荐两种实用方式:

1. 用requests直接发POST请求(最轻量化)

这是最直接的路子,不需要任何GraphQL专用库,只要构造正确的请求体就行,适合快速验证接口:

import requests

GRAPHQL_ENDPOINT = "http://your-server-url/graphql"

def run_graphql_query(query, variables=None):
    headers = {"Content-Type": "application/json"}
    payload = {"query": query, "variables": variables or {}}
    response = requests.post(GRAPHQL_ENDPOINT, json=payload, headers=headers)
    response.raise_for_status()  # 自动抛出HTTP错误
    return response.json()

# 示例查询,只要你知道接口结构就能写
test_query = """
query GetUser($userId: ID!) {
  user(id: $userId) {
    id
    name
    email
  }
}
"""

result = run_graphql_query(test_query, {"userId": "123"})
print(result)

这种方式完全绕开了本地Schema的问题,只要你清楚查询的结构和变量格式,就能直接测试。

2. 用gql库(专门的Python GraphQL客户端)

如果想要更专业的GraphQL客户端体验,gql库是个好选择,它支持直接向远程端点发查询,不需要本地Schema:
先安装依赖:

pip install gql requests

然后写代码:

from gql import Client, gql
from gql.transport.requests import RequestsHTTPTransport

# 配置服务器连接
transport = RequestsHTTPTransport(
    url="http://your-server-url/graphql",
    use_json=True,
)

# 初始化客户端,关闭自动拉取Schema的功能
client = Client(transport=transport, fetch_schema_from_transport=False)

# 定义查询
query = gql("""
query GetUser($userId: ID!) {
  user(id: $userId) {
    id
    name
    email
  }
}
""")

# 执行查询
result = client.execute(query, variable_values={"userId": "123"})
print(result)

这里fetch_schema_from_transport=False就是告诉客户端不用从服务器拉取Schema,直接执行你写的查询就行。

二、在Python中导入或指定GraphQL Schema(以Graphene为例)

如果你的测试需要本地校验查询格式,或者要基于Schema做一些自动化生成,有两种方法导入现有的type.graphqls文件:

1. 用graphql-core直接解析Schema文件

graphql-core是GraphQL的官方Python实现,可以直接加载并解析.graphql格式的Schema文件:
先装依赖:

pip install graphene graphql-core

然后加载Schema:

from graphql import build_schema, parse

# 从本地文件读取Schema内容
with open("type.graphqls", "r") as f:
    schema_def = f.read()

# 解析成可操作的Schema对象
graphql_schema = build_schema(schema_def)

# 可以用它来校验查询是否符合Schema规范
def validate_query(query):
    try:
        parsed_query = parse(query)
        graphql_schema.validate(parsed_query)
        print("查询格式符合Schema规范!")
        return True
    except Exception as e:
        print(f"查询校验失败:{e}")
        return False

# 示例校验
test_query = """
query GetUser($userId: ID!) {
  user(id: $userId) {
    id
    name
  }
}
"""
validate_query(test_query)

这种方式适合做查询的合法性校验,确保你写的查询不会因为格式问题被服务器拒绝。

2. 在Graphene中手动映射Schema(适合本地模拟)

如果你的测试需要模拟服务器的逻辑,或者编写单元测试,可以手动在Graphene中定义和type.graphqls对应的类型。比如你的type.graphqls内容是:

type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  user(id: ID!): User
}

那么在Graphene中可以这样写:

import graphene

# 定义User类型,和Schema对应
class User(graphene.ObjectType):
    id = graphene.ID(required=True)
    name = graphene.String(required=True)
    email = graphene.String(required=True)

# 定义Query类型,实现resolver逻辑
class Query(graphene.ObjectType):
    user = graphene.Field(User, id=graphene.ID(required=True))

    def resolve_user(self, info, id):
        # 这里可以写测试用的模拟逻辑,比如返回固定数据
        return User(id=id, name="测试用户", email="test@example.com")

# 创建Graphene Schema对象
schema = graphene.Schema(query=Query)

# 执行本地查询
result = schema.execute("""
query GetUser($userId: ID!) {
  user(id: $userId) {
    id
    name
    email
  }
}
""", variable_values={"userId": "123"})

print(result.data)

这种方式适合做单元测试,或者在没有服务器的情况下验证查询逻辑。


内容的提问来源于stack exchange,提问作者Timopheym

火山引擎 最新活动