测试并调试解析程序 - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

测试并调试解析程序

Amazon AppSync 针对数据源执行 GraphQL 字段的解析程序。在解析程序映射模板概述中已经介绍过,解析程序使用模板化的语言与数据源进行通信,从而支持您自定义行为,并在与数据源通信前后应用逻辑和条件。要了解编写解析程序的入门教程式的编程指南,请参阅解析程序映射模板编程指南

为了帮助开发人员编写、测试并调试这些解析程序,Amazon AppSync 控制台还提供工具,针对每个字段的解析程序使用模拟数据创建 GraphQL 请求和响应。您还可以在中执行查询、更改和订阅Amazon AppSync 控制台,并查看来自 Amazon 的详细日志流 CloudWatch 整个请求的。其中包括从数据源获得的结果。

使用模拟数据进行测试

在调用 GraphQL 解析程序时,它包含的 context 对象具有您所编程的请求的相关信息。其中包括来自客户端的参数、身份信息以及 GraphQL 父字段的数据。它还包括来自数据源、可在响应模板中使用的结果。有关此结构的更多信息以及在编程时可用的帮助程序实用程序,请参阅解析程序映射模板上下文参考

在编写或编辑解析程序函数时,您可以将模拟测试 context 对象传递到控制台编辑器中。这使您能够查看请求和响应模板如何评估,而不必针对数据源实际运行。例如,您可以传递测试 firstname: Shaggy 参数,观察在您的模板代码中使用 $ctx.args.firstname 时如何评估。您还可以测试任何实用程序帮助程序(例如 $util.autoId()util.time.nowISO8601())的评估。

测试解析程序

在 Amazon AppSync 控制台中,转到 Schema (架构) 页面,并在右侧选择现有的解析程序进行编辑。或者选择 Attach (附加) 添加新的解析程序。在页面顶部,选择 Select test context (选择测试上下文),选择 Create new context (新建上下文),然后输入名称。接下来,可以从现有示例上下文对象中选择,或手动填充 JSON,然后选择 Save (保存)。要使用此模拟上下文对象评估解析程序,请选择 Run Test (运行测试)

例如,假设您的应用程序存储 GraphQL 类型Dog针对对象使用自动 ID 生成,并将它们存储在 Amazon DynamoDB 中。您还希望写入 GraphQL 更改参数的一些值,而且仅允许特定用户看到响应。下面显示了架构的外观:

type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }

如果为 addDog 更改添加解析程序,您可以填充与以下代码类似的上下文对象。以下代码拥有 nameage 客户端的参数,以及 identity 对象中填充的 username

{ "arguments" : { "firstname": "Shaggy", "age": 4 }, "source" : {}, "result" : { "breed" : "Miniature Schnauzer", "color" : "black_grey" }, "identity": { "sub" : "uuid", "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}", "username" : "Nadia", "claims" : { }, "sourceIp" :[ "x.x.x.x" ], "defaultAuthStrategy" : "ALLOW" } }

您可以使用以下请求和响应映射模板测试此内容:

请求模板

{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : { "S" : "$util.autoId()" } }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) }

响应模板

#if ($context.identity.username == "Nadia") $util.toJson($ctx.result) #else $util.unauthorized() #end

经过评估的模板拥有您的测试上下文对象的数据,以及 $util.autoId() 生成的值。此外,如果您要将 username 更改为除 Nadia 之外的值,将不会返回结果,因为授权检查将失败。有关精细访问控制的更多信息,请参阅授权使用案例

使用测试映射模板Amazon AppSync的 API

您可以使用EvaluateMappingTemplate使用模拟数据远程测试地图模板的 API 命令。要开始使用此命令,请确保您已添加appsync:evaluateMappingTemplate您的策略的权限。例如:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateMappingTemplate", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }

你可以通过使用Amazon CLI要么Amazon软件开发工具包. 例如,使用Dogschema 及其上一节中的请求/响应映射模板。使用本地工作站上的 CLI 将请求模板保存到名为的文件中request.vtl,然后保存context对象转换为名为的文件context.json. 从shell,运行以下命令:

aws appsync evaluate-mapping-template --template file://request.vtl --context file://context.json

此命令将返回以下响应:

{ "evaluationResult": "{\n \"version\" : \"2017-02-28\",\n \"operation\" : \"PutItem\",\n \"key\" : {\n \"id\" : { \"S\" : \"afcb4c85-49f8-40de-8f2b-248949176456\" }\n },\n \"attributeValues\" : {\"firstname\":{\"S\":\"Shaggy\"},\"age\":{\"N\":4}}\n}\n" }

这些区域有:evaluationResult包含使用提供的测试您提供的模板的结果context. 您也可以使用测试您的模板Amazon开发工具包。下面是使用的示例Amazon适用于的开发工具包 JavaScript V2:

const AWS = require('aws-sdk') const client = new AWS.AppSync({ region: 'us-east-2' }) const template = fs.readFileSync('./request.vtl', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') client .evaluateMappingTemplate({ template, context }) .promise() .then((data) => console.log(data))

使用 SDK,您可以轻松整合来自您最喜爱的测试套件的测试,以验证模板的行为。我们建议使用创建测试测试框架,但任何测试套件都能正常工作。以下代码段显示了一个假设的验证运行。请注意,我们希望评估响应是有效的 JSON,因此我们使用JSON.parse要从字符串响应中检索 JSON,请执行以下操作:

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) test('request correctly calls DynamoDB', async () => { const template = fs.readFileSync('./request.vtl', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateMappingTemplate({ template, context }).promise() const result = JSON.parse(response.evaluationResult) expect(result.key.id.S).toBeDefined() expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname) })

这将生成以下结果:

Ran all test suites. > jest PASS ./index.test.js ✓ request correctly calls DynamoDB (543 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 1.511 s, estimated 2 s

调试实时查询

没有什么可以替代的 end-to-end 测试和日志记录以调试生产应用程序。Amazon AppSync 允许您使用亚马逊记录错误和完整的请求详细信息 CloudWatch. 此外,您可以使用 Amazon AppSync 控制台测试 GraphQL 查询、更改和订阅,以及返回查询编辑器的每个请求的实时流日志数据,以便进行实时调试。对于订阅而言,日志显示连接时间信息。

要执行此操作,您需要使用亚马逊 CloudWatch 提前启用了日志,如中所述监控和日志记录. 接下来,在 Amazon AppSync 控制台中,选择 Queries (查询) 选项卡,然后输入有效的 GraphQL 查询。在右下部分中,选择 Logs (日志) 复选框以打开日志视图。在页面顶部,选择“播放”箭头图标运行您的 GraphQL 查询。片刻之后,此操作的完整请求和响应日志将流式传输到控制台的这一部分,之后您可以在控制台中进行查看。