автор Том Брайтбилл, Тим Обезук

Если вы не знали, 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 г.