如何在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




