автор Том Брайтбилл, Тим Обезук
Если вы не знали, Cloudflare Workers позволяет запускать Javascript во всех 165+ наших центрах обработки данных. Мы рады видеть некоторые творческие приложения Workers. По мере усложнения вариантов использования растет и потребность в проверке работоспособности вашего кода.
В частности, если ваш Worker включает в себя несколько функций, важно убедиться, что каждая функция делает то, для чего она предназначена, в дополнение к тому, что выходные данные всего Worker возвращаются должным образом.
В этом посте мы собираемся продемонстрировать, как выполнять модульное тестирование Cloudflare Workers и их отдельных функций с помощью Cloudworker, созданного командой инженеров Dollar Shave Club.
Dollar Shave Club является клиентом Cloudflare, и они создали Cloudworker, макет среды выполнения Workers, для целей тестирования. Мы очень благодарны им за это. Они были достаточно любезны, чтобы запостить в нашем блоге об этом.
Этот пост продемонстрирует, как абстрагироваться от Cloudworker и протестировать Workers с тем же синтаксисом, в котором вы их пишете.
Пример сценария
Прежде чем мы приступим к настройке Cloudworker, давайте представим простой скрипт, который мы будем тестировать в нашем примере. Как видите, этот сценарий содержит две функции, каждая из которых отвечает за ответ клиенту.
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function addition(a, b) {
return a + b
}
async function handleRequest(request) {
const added = await addition(1,3)
return new Response(`The Sum is ${added}!`)
}
Этот скрипт будет активен для маршрута worker.example.com
.
Настройка каталога
После того, как я создал новый проект npm ( npm init
) в новом каталоге, я поместил внутрь свой файл worker.js
, содержащий все вышеперечисленное, и создал папку test
, содержащую worker-test.js
. Структура выложена ниже.
.
----- worker.js
----- test
. worker-test.js
----- node_modules
----- package.json
----- package-lock.json.
Затем мне нужно установить Cloudworker ( npm install @dollarshaveclub/cloudworker --save-dev
) и среду тестирования Mocha ( npm install mocha --save-dev
), если она не установлена глобально. Убедитесь, что package.json
отражает значение mocha
для tests
, например:
"scripts": {
"test": "mocha"
}
Теперь мы, наконец, можем написать несколько тестов! К счастью, mocha
имеет поддержку async/await
, что очень упрощает задачу. Идея проста: Cloudworker позволяет размещать Worker в разработке перед HTTP-запросом и проверять ответ.
Написание тестов!
Перед любой тестовой логикой мы поместим две строки вверху тестового файла ( worker-test.js
). Первая строка присваивает все значения свойств из Cloudworker и нашего скрипта Worker глобальному контексту до того, как каждый async function()
запускается в mocha. Вторая строка требует assert
, который обычно используется для сравнения ожидаемого вывода с фиктивным выводом.
before(async function () {
Object.assign(global, new (require('@dollarshaveclub/cloudworker'))(require('fs').readFileSync('worker.js', ‘utf8’)).context);
});
// You will replace worker.js with the relative path to your worker
const assert = require('assert')
Теперь тестирование больше похоже на самого Worker, поскольку мы получаем доступ ко всем базовым функциям, используемым Cloudworker И скриптом Worker.
describe('Worker Test', function() {
it('returns a body that says The Sum is 4', async function () {
let url = new URL('https://worker.example.com')
let req = new Request(url)
let res = await handleRequest(req)
let body = await res.text()
assert.equal(body, 'The Sum is 4!')
})
it('does addition properly', async function() {
let res = await addition(1, 1)
assert.equal(res, 2)
})
})
Таким образом, мы можем протестировать отдельные функции с нашим Worker, как показано выше с вызовом функции addition()
. Это действительно мощный инструмент, который обеспечивает большую уверенность при развертывании сложных рабочих процессов, поскольку вы можете протестировать каждый компонент, из которого состоит скрипт. Мы надеемся, что это было полезно, и приветствуем любые отзывы.
Первоначально опубликовано на blog.cloudflare.com 15 марта 2019 г.