与我们一起从10月8日至10日参加在纽约市举办的 GraphQL 联邦和 API 平台工程最新技巧、趋势和新闻。参加2024年纽约市的GraphQL峰会
文档
免费开始

使用Apollo Federation进行测试

单元、集成、端到端、组合以及组件和操作测试

客户端服务器联邦测试

💡 技巧

如果您是企业客户并希望了解更多有关此主题的材料,请尝试企业最佳实践:测试上的课程。

不是企业客户? 了解GraphOS企业版。

中进行测试可能看起来需要更多步骤,但这是因为您的 GraphQL 架构可能会涉及您的技术栈的许多领域,从前端使用 到后端使用 ,或者您的基础设施使用您的 到您的 中的单独 。在实践中,如果使用其他任何 API 技术的话,所有这些领域都应该以相同的方式进行适当测试,但往往跨团队或应用程序等边界进行测试时可能需要一些新步骤。通过本指南的最后部分,您应该做到以下几项:

单元测试

我们建议为您每个 的解析器 创建单元测试。解析器是在您的架构的每个类型或 中调用的代码,这为隔离测试创造了自然边界。在进行测试时,我们建议尽可能多地使用像 @faker-js/faker 这样的包来生成模拟输入和输出的真实仿造数据。

使用 @faker-js/fakerjest 中模拟返回值看起来如下:

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.

端到端测试

请遵守以下最佳实践以创建您的 超级图的端到端测试:

  • 在测试环境中运行所有 子图路由器,使用模拟数据或测试数据
  • 使用针对您的 超级图实际执行的实际 操作
    • 您可以在 中查看最近 操作的 详细信息
    • 避免使用模板或随机生成的 操作,因为这些操作无法反映实际流量。
    • 如果您尚未在生产环境中,我们建议尽可能使这些测试接近您认为它们应该的样子。
    • 确保包含,这些操作跨越多个子图,以验证实体 的。
  • 使用以确保高操作基数。
    • 如果您的测试操作没有使用任何GraphQL变量(或者如果您跨执行使用相同的变量值),则您的supergraph可能会返回缓存数据。这绕过了大量执行逻辑,限制了测试的有效性。
    • 通过使用各种操作和值,您可以确保您的测试结果在缓存中的击中率最低。

组合测试

测试特定于联邦架构。这涉及测试您的能否成功地组合为可解析客户端发送的操作的超图模式。您可以通过在超图模式中组合子图模式和通过Rover CLI,通过rover subgraph check命令执行这些测试。我们建议将此检查作为代码审查的一部分以及在进行持续部署(CD)管道时执行,以确认您即将部署的更改与上次执行检查时有效。

组件和操作测试

幸运的是,客户端并不真正意识到它们是在使用联邦 GraphQL API 还是非联邦的 GraphQL API,因此测试最佳实践保持不变。我们的模式可以提供一个方便的层来模拟数据提取,或者对于单独的组件,您可以模拟注入或获取您的 GraphQL 数据的特定客户端提供者:

下一步
评级文章评级在GitHub编辑编辑论坛Discord

©2024Apollo Graph Inc.,即Apollo GraphQL。

隐私政策

公司