使用Apollo Federation进行测试
单元、集成、端到端、组合以及组件和操作测试
在 GraphQL 中进行测试可能看起来需要更多步骤,但这是因为您的 GraphQL 架构可能会涉及您的技术栈的许多领域,从前端使用 Apollo 客户端 到后端使用 Apollo Server,或者您的基础设施使用您的 GraphOS 路由器 到您的 supergraph 中的单独 subgraph。在实践中,如果使用其他任何 API 技术的话,所有这些领域都应该以相同的方式进行适当测试,但往往跨团队或应用程序等边界进行测试时可能需要一些新步骤。通过本指南的最后部分,您应该做到以下几项:
- 单元测试 个体 subgraph 中
- 集成测试 为独立的 subgraph
- 端到端测试 对您的整个 supergraph
- 组合测试 用于生成 supergraph schema 的方案
- 组件和操作测试 用于您的客户端
单元测试
我们建议为您每个 subgraph 服务器 的解析器 创建单元测试。解析器是在您的架构的每个类型或 字段 中调用的代码,这为隔离测试创造了自然边界。在进行测试时,我们建议尽可能多地使用像 @faker-js/faker
这样的包来生成模拟输入和输出的真实仿造数据。
使用 @faker-js/faker
在 jest
中模拟返回值看起来如下:
import {faker} from '@faker-js/faker';const testUser = {userId: faker.datatype.uuid(),username: faker.internet.userName(),email: faker.internet.email(),avatar: faker.image.avatar(),password: faker.internet.password(),birthdate: faker.date.birthdate(),registeredAt: faker.date.past()};const mockedFunction = jest.fn().mockReturnValue(testUser);
单元测试中的引用解析器
__resolveReference函数(也称为引用解析器)
允许不同的子图解析联邦对象的字段。这些也是函数,因此它们是使用模拟进行单元测试的良好边界。引用解析器对于联邦操作的顺利执行至关重要,因此它们需要验证。
集成测试
子图的集成测试应该启动单个子图,并将操作发送到模拟或测试环境中的模式。要单独测试子图,请验证所有字段,特别是您查询中的顶级字段以及在突变中的应用,并使用所有输入的排列来检查您的模式是否与解析器匹配。
集成测试中的实体解析器
根据您的模式和操作,查询计划可能将从子图使用实体解析器获取数据。在这种情况下,集成测试涉及模拟网关/路由器。您可以执行针对_entities的查询以进行集成测试,并且测试用例应该涵盖所有儿子图可以解析的实体类型(带有@key标记的所有类型)。
这看起来如下
query GetEntities($representations: [_Any!]!) {_entities(representations: $representations) {... on User {firstName}}}
使用以下输入
{"representations": [{"__typename": "User","id": "5"}]}
有关如何测试这些 操作的更多示例,请参阅 Query._entities
.
端到端测试
请遵守以下最佳实践以创建您的 超级图的端到端测试:
- 在测试环境中运行所有 子图和 路由器,使用模拟数据或测试数据
- 使用针对您的 超级图实际执行的实际 操作。
- 您可以在 GraphOS Studio 中查看最近 操作的 详细信息。
- 避免使用模板或随机生成的 操作,因为这些操作无法反映实际流量。
- 如果您尚未在生产环境中,我们建议尽可能使这些测试接近您认为它们应该的样子。
- 确保包含操作,这些操作跨越多个子图,以验证实体 解析器的。
- 使用变量以确保高操作基数。
- 如果您的测试操作没有使用任何GraphQL变量(或者如果您跨执行使用相同的变量值),则您的supergraph可能会返回缓存数据。这绕过了大量执行逻辑,限制了测试的有效性。
- 通过使用各种操作和变量值,您可以确保您的测试结果在缓存中的击中率最低。
组合测试
组合测试特定于联邦架构。这涉及测试您的子图模式能否成功地组合为可解析客户端发送的操作的超图模式。您可以通过在超图模式中组合子图模式和通过Rover CLI,通过rover subgraph check
命令执行这些测试。我们建议将此检查作为代码审查的一部分以及在进行持续部署(CD)管道时执行,以确认您即将部署的更改与上次执行检查时有效。
组件和操作测试
幸运的是,客户端并不真正意识到它们是在使用联邦 GraphQL API 还是非联邦的 GraphQL API,因此测试最佳实践保持不变。我们的模式可以提供一个方便的层来模拟数据提取,或者对于单独的组件,您可以模拟注入或获取您的 GraphQL 数据的特定客户端提供者: