Как я могу написать модульные тесты для шаблонов скорости?
Это вообще возможно?
Здравствуйте друзья. Я нахожусь в процессе создания приложения с использованием AWS AppSync + DynamoDB, и у меня начинает появляться довольно большая куча шаблонов сопоставления преобразователей, все из которых написаны с использованием Apache Velocity Template Language (VTL).
Я начинаю беспокоиться о том, что эти vtl-файлы весьма критичны для приложения (поскольку они определяют способ получения данных), и ошибка в одном из них может привести к хаосу. Так что, как и любая критическая часть системы... Я хотел бы написать для них несколько автоматических модульных тестов. Но я не нашел много о других, делающих это.
- Если вы используете VTL (с AppSync или API Gateway), как вы их тестируете?
- Можно ли даже написать автоматические тесты для скоростных шаблонов?
- Или я иду по неверному пути, и мне просто нужно использовать Lambdas в качестве распознавателей?
Заранее спасибо!
2 ответа
Мне потребовалось время, чтобы самому понять это, но я нашел хороший способ написать модульные тесты для моих шаблонов запросов и ответов VTL. Я использовалamplify-appsync-simulator
Класс VelocityTemplate пакета npm. Единственное предостережение, которое я видел до сих пор, заключается в том, что вам нужно использовать$context
в вашем VTL сокращенное $ctx
не распознается симуляторами визуализации VTL. Проверить это:
Мой VTL:
#set( $timeNow = $util.time.nowEpochMilliSeconds() )
{
"version" : "2018-05-29",
"operation" : "PutItem",
"key": {
"pk" : { "S" : "game#${util.autoId()}" },
"sk" : { "S" : "meta#${timeNow}" }
},
"attributeValues" : {
"players": { "L" : [
{ "M" : {
## num and color added at start game
"player": $util.dynamodb.toDynamoDBJson($context.args.input.player)
}}
]},
"createdBy": { "S": "${context.identity.sub}"},
"gsipk": { "S": "${context.args.input.status}"},
"gsisk": { "S": "${context.args.input.level}#${context.args.input.maxPlayers}"},
"gsipk2": {"S": "game"},
"turns": { "L": [] },
"nextPlayerNum": { "N": 1 },
"createdAt": { "N": ${timeNow} },
"updatedAt": { "N": ${timeNow} }
}
}
Мой тест:
import { AmplifyAppSyncSimulator } from 'amplify-appsync-simulator'
import { VelocityTemplate } from "amplify-appsync-simulator/lib/velocity"
import { readFileSync } from 'fs'
import path from 'path';
const vtl = readFileSync(path.join(__dirname, '..', 'addGame-request-mapping-template.vtl'))
const template = {
content: vtl
}
const velocity = new VelocityTemplate(template, new AmplifyAppSyncSimulator)
describe('valid user and request', () => {
// This is the graphql input
const validContext = {
arguments: {
input: {
player: 'player#1234',
maxPlayers: 4,
status: 'new',
level: 7
}
},
source: {}
}
// This is a logged in user with a JWT
const requestContext = {
requestAuthorizationMode: 'OPENID_CONNECT',
jwt: {
sub: 'abcd1234'
}
}
const info = {
fieldNodes: []
}
it('works', () => {
const result = velocity.render(validContext, requestContext, info)
expect(result).toEqual({
result: {
version: "2018-05-29",
operation: "PutItem",
key: {
pk: { S: expect.stringMatching(/^game#[a-f0-9-]*$/) },
sk: { S: expect.stringMatching(/^meta#[0-9]*$/)}
},
attributeValues: {
players: {
L: [
{ M: { player: { S: validContext.arguments.input.player }}}
]
},
createdBy: { S: requestContext.jwt.sub },
gsipk: { S: validContext.arguments.input.status },
gsisk: { S: `${validContext.arguments.input.level}#${validContext.arguments.input.maxPlayers}`},
gsipk2: { S: 'game' },
turns: { L: [] },
nextPlayerNum: { N: 1 },
createdAt: { N: expect.any(Number) },
updatedAt: { N: expect.any(Number) }
}
},
stash: {},
errors: [],
isReturn: false
})
})
})
Нашел этот проект https://github.com/ToQoz/api-gateway-mapping-template который немного стар, но все еще работает.
Он предназначен для тестирования шаблонов сопоставления API Gateway, поэтому в нем отсутствуют все специальные $util
функции, которые вы получаете с распознавателями AppSync, но я думаю, что можно постепенно добавлять недостающие утилиты.
Amplify только что выпустила возможность локального тестирования API-интерфейса AppSync, включая средства распознавания VTL. Вы можете проверить их сообщение в блоге https://aws.amazon.com/blogs/aws/new-local-mocking-and-testing-with-the-amplify-cli/ которое содержит инструкции для локального API Mocking функциональные возможности; Найдите, где написано: "Когда я редактирую шаблон VTL, интерфейс командной строки Amplify немедленно распознает это и генерирует обновленный код для распознавателя". Затем вы можете встроить это в CI или другой конвейер тестирования по вашему выбору.