Как макетировать сервисы используя Mountebank и Node.js

Автор выбралOpen Internet/Free Speech Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

В сложныхservice-oriented architectures (SOA) программам часто требуется вызывать несколько служб для выполнения заданного рабочего процесса. Это нормально, когда все на месте, но если для кода, над которым вы работаете, требуется служба, которая все еще находится в разработке, вы можете застрять в ожидании, пока другие команды закончат свою работу, прежде чем начинать свою. Кроме того, для целей тестирования вам может потребоваться взаимодействие со службами сторонних поставщиков, такими как API погоды или система учета. Поставщики обычно не предоставляют вам столько сред, сколько вам нужно, и зачастую не позволяют легко контролировать данные испытаний в своих системах. В этих ситуациях незавершенные сервисы и сервисы, находящиеся вне вашего контроля, могут затруднить тестирование кода.

Решение всех этих проблем - создатьservice mock. Макет сервиса - это код, который имитирует сервис, который вы будете использовать в конечном продукте, но он легче, менее сложен и проще в управлении, чем реальный сервис, который вы использовали бы в производстве. Вы можете настроить фиктивную службу так, чтобы она возвращала ответ по умолчанию или определенные тестовые данные, а затем запускать программное обеспечение, которое вас интересует в тестировании, как если бы зависимая служба действительно была там. Из-за этого наличие гибкого способа макетирования сервисов может сделать ваш рабочий процесс быстрее и эффективнее.

В корпоративной среде создание фиктивных служб иногда называютservice virtualization. Виртуализация сервисов часто ассоциируется с дорогостоящими корпоративными инструментами, но вам не нужен дорогой инструмент для имитации сервиса. Mountebank - это бесплатный инструмент с открытым исходным кодом для имитации сервисов, который можно использовать для имитации сервисов HTTP, включая сервисыREST иSOAP. Вы также можете использовать его для имитации запросовSMTP илиTCP.

В этом руководстве вы создадите два гибких приложения для имитации сервисов, используяNode.js и Mountebank. Обе имитирующие службы будут прослушивать определенный порт для запросов REST в HTTP. В дополнение к этому простому фиктивному поведению, служба также будет извлекать фиктивные данные изcomma-separated values (CSV) file. После этого урока вы сможете смоделировать все виды поведения службы, чтобы вам было легче разрабатывать и тестировать свои приложения.

Предпосылки

Чтобы следовать этому уроку, вам понадобится следующее:

  • Версия 8.10.0 или выше Node.js установлена ​​на вашем компьютере. Этот учебник будет использовать версию 8.10.0. Чтобы установить Node.js, проверьтеHow To Install Node.js on Ubuntu 18.04 илиHow to Install Node.js and Create a Local Development Environment on macOS.

  • Инструмент для выполнения HTTP-запросов, напримерcURL илиPostman. В этом руководстве будет использоваться cURL, поскольку он установлен по умолчанию на большинстве машин; если на вашем компьютере нет cURL, посмотритеinstall documentation.

[[step-1 -—- start-a-node-js-application]] == Шаг 1. Запуск приложения Node.js

На этом шаге вы создадите базовое приложение Node.js, которое будет служить основой вашего экземпляра Mountebank и поддельных сервисов, которые вы создадите на последующих шагах.

[.Примечание]##

Note: Mountebank можно использовать как отдельное приложение, установив его глобально с помощью командыnpm install -g mountebank. Затем вы можете запустить его с помощью командыmb и добавить имитации с помощью запросов REST.

Хотя это самый быстрый способ запустить и запустить Mountebank, самостоятельное создание приложения Mountebank позволяет запускать набор предопределенных макетов при запуске приложения, которые затем можно сохранить в системе управления версиями и поделиться ими со своей командой. В этом руководстве приложение Mountebank будет создано вручную, чтобы воспользоваться этим.

Сначала создайте новый каталог для размещения вашего приложения. Вы можете назвать его как хотите, но в этом уроке мы назовем егоapp:

mkdir app

Перейдите во вновь созданный каталог с помощью следующей команды:

cd app

Чтобы запустить новое приложение Node.js, запуститеnpm init и заполните запросы:

npm init

Данные из этих запросов будут использоваться для заполнения вашего файлаpackage.json, в котором описывается, что такое ваше приложение, на какие пакеты оно опирается и какие сценарии оно использует. В приложениях Node.js сценарии определяют команды, которые создают, запускают и тестируют ваше приложение. Вы можете перейти к значениям по умолчанию для запросов или ввести название пакета, номер версии и т. Д.

После выполнения этой команды у вас будет базовое приложение Node.js, включая файлpackage.json.

Теперь установите пакет Mountebank npm, используя следующее:

npm install -save mountebank

Эта команда захватывает пакет Mountebank и устанавливает его в ваше приложение. Обязательно используйте флаг-save, чтобы обновить файлpackage.json с помощью Mountebank в качестве зависимости.

Затем добавьте вpackage.json сценарий запуска, который запускает командуnode src/index.js. Этот сценарий определяет точку входа вашего приложения какindex.js, которую вы создадите на более позднем этапе.

Откройтеpackage.json в текстовом редакторе. Вы можете использовать любой текстовый редактор, который хотите, но в этом уроке будет использоваться nano.

nano package.json

Перейдите в раздел"scripts" и добавьте строку"start": "node src/index.js". Это добавит командуstart для запуска вашего приложения.

Ваш файлpackage.json должен выглядеть примерно так, в зависимости от того, как вы заполнили начальные запросы:

app/package.json

{
  "name": "diy-service-virtualization",
  "version": "1.0.0",
  "description": "An application to mock services.",
  "main": "index.js",
  "scripts": {
    "start": "node src/index.js"
  },
  "author": "Dustin Ewers",
  "license": "MIT",
  "dependencies": {
    "mountebank": "^2.0.0"
  }
}

Теперь у вас есть база для вашего приложения Mountebank, которую вы создали, создав свое приложение, установив Mountebank и добавив стартовый скрипт. Затем вы добавите файл настроек для хранения настроек приложения.

[[шаг-2 -—- создание-файла-настроек]] == Шаг 2. Создание файла настроек

На этом шаге вы создадите файл настроек, который определяет, какие порты будут прослушивать экземпляр Mountebank и две ложные службы.

Каждый раз, когда вы запускаете экземпляр Mountebank или фиктивную службу, вам нужно будет указать, на каком сетевом порту будет работать эта служба (например,http://localhost:5000/). Поместив их в файл настроек, другие части вашего приложения смогут импортировать эти настройки всякий раз, когда им нужно будет знать номер порта для служб и экземпляр Mountebank. Хотя вы можете напрямую кодировать их в свое приложение как константы, позднее изменить настройки будет проще, если вы сохраните их в файле. Таким образом, вам нужно будет изменить значения только в одном месте.

Начните с создания каталога с именемsrc из вашего каталогаapp:

mkdir src

Перейдите к папке, которую вы только что создали:

cd src

Создайте файл с именемsettings.js и откройте его в текстовом редакторе:

nano settings.js

Затем добавьте настройки для портов для основного экземпляра Mountebank и двух ложных сервисов, которые вы создадите позже:

app/src/settings.js

module.exports = {
    port: 5000,
    hello_service_port: 5001,
    customer_service_port: 5002
}

В этом файле настроек есть три записи:port: 5000 назначает порт5000 основному экземпляру Mountebank,hello_service_port: 5001 назначает порт5001 тестовой службе Hello World, которую вы создадите позже. step, аcustomer_service_port: 5002 назначает порт5002 фиктивному сервисному приложению, которое будет отвечать данными CSV. Если порты здесь заняты, смело меняйте их на все, что вы хотите. module.exports = позволяет другим вашим файлам импортировать эти настройки.

На этом этапе вы использовалиsettings.js для определения портов, которые Mountebank и ваши имитирующие службы будут прослушивать, и сделали эти настройки доступными для других частей вашего приложения. На следующем шаге вы создадите скрипт инициализации с этими настройками, чтобы запустить Mountebank.

[[step-3 -—- building-the-initialization-script]] == Шаг 3 - Создание сценария-инициализации

На этом шаге вы создадите файл, который запускает экземпляр Mountebank. Этот файл будет точкой входа в приложение, что означает, что при запуске приложения этот сценарий будет запускаться первым. Вы добавите больше строк в этот файл при создании новых сервисных макетов.

В каталогеsrc создайте файл с именемindex.js и откройте его в текстовом редакторе:

nano index.js

Чтобы запустить экземпляр Mountebank, который будет работать на порту, указанном в файлеsettings.js, который вы создали на последнем шаге, добавьте в файл следующий код:

app/src/index.js

const mb = require('mountebank');
const settings = require('./settings');

const mbServerInstance = mb.create({
        port: settings.port,
        pidfile: '../mb.pid',
        logfile: '../mb.log',
        protofile: '../protofile.json',
        ipWhitelist: ['*']
    });

Этот код делает три вещи. Во-первых, он импортирует пакет npm Mountebank, который вы установили ранее (const mb = require('mountebank');). Затем он импортирует модуль настроек, созданный на предыдущем шаге (const settings = require('./settings');). Наконец, он создает экземпляр сервера Mountebank сmb.create().

Сервер будет прослушивать порт, указанный в файле настроек. Параметрыpidfile,logfile иprotofile предназначены для файлов, которые Mountebank использует для внутренних целей для записи идентификатора своего процесса, указывает, где он хранит свои журналы, и устанавливает файл для загрузки пользовательских реализаций протокола. ПараметрipWhitelist указывает, какие IP-адреса разрешены для связи с сервером Mountebank. В этом случае вы открываете его для любого IP-адреса.

Сохраните и выйдите из файла.

После того, как этот файл на месте, введите следующую команду для запуска приложения:

npm start

Командная строка исчезнет, ​​и вы увидите следующее:

info: [mb:5000] mountebank v2.0.0 now taking orders - point your browser to http://localhost:5000/ for help

Это означает, что ваше приложение открыто и готово принимать запросы.

Далее проверьте свой прогресс. Откройте новое окно терминала и используйтеcurl для отправки следующего запросаGET на сервер Mountebank:

curl http://localhost:5000/

Это вернет следующий ответ JSON:

Output{
    "_links": {
        "imposters": {
            "href": "http://localhost:5000/imposters"
        },
        "config": {
            "href": "http://localhost:5000/config"
        },
        "logs": {
            "href": "http://localhost:5000/logs"
        }
    }
}

JSON, который возвращает Mountebank, описывает три различные конечные точки, которые вы можете использовать для добавления или удаления объектов в Mountebank. Используяcurl для отправки запросов на эти конечные точки, вы можете взаимодействовать со своим экземпляром Mountebank.

Когда вы закончите, вернитесь в первое окно терминала и выйдите из приложения, используяCTRL +C. Это выходит из вашего приложения Node.js, чтобы вы могли продолжить добавление к нему.

Теперь у вас есть приложение, которое успешно запускает экземпляр Mountebank. На следующем шаге вы создадите клиент Mountebank, который использует REST-запросы для добавления ложных сервисов в ваше приложение Mountebank.

[[step-4 -—- building-a-mountebank-client]] == Шаг 4. Создание клиента Mountebank

Mountebank общается с помощью REST API. Вы можете управлять ресурсами своего экземпляра Mountebank, отправляя HTTP-запросы различным конечным точкам, указанным в последнем шаге. Чтобы добавить фиктивную службу, вы отправляете запрос HTTPPOST в конечную точку самозванца. imposter - это название фиктивного сервиса в Mountebank. Самозванцы могут быть простыми или сложными, в зависимости от поведения, которое вы хотите в своем макете.

На этом этапе вы создадите клиент Mountebank для автоматической отправки запросовPOST в службу Mountebank. Вы можете отправить запросPOST конечной точке самозванца с помощьюcurl или Postman, но вам придется отправлять тот же запрос каждый раз, когда вы перезапускаете тестовый сервер. Если вы используете пример API с несколькими имитациями, будет эффективнее написать клиентский скрипт, который сделает это за вас.

Начните с установки библиотекиnode-fetch:

npm install -save node-fetch

node-fetch library дает вам реализацию JavaScript Fetch API, который можно использовать для написания более коротких HTTP-запросов. Вы можете использовать стандартную библиотекуhttp, но использованиеnode-fetch является более легким решением.

Теперь создайте клиентский модуль для отправки запросов в Mountebank. Вам нужно только разместить самозванцев, поэтому этот модуль будет иметь один метод.

Используйтеnano для создания файла с именемmountebank-helper.js:

nano mountebank-helper.js

Чтобы настроить клиент, поместите в файл следующий код:

app/src/mountebank-helper.js

const fetch = require('node-fetch');
const settings = require('./settings');

function postImposter(body) {
    const url = `http://127.0.0.1:${settings.port}/imposters`;

    return fetch(url, {
                    method:'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify(body)
                });
}

module.exports = { postImposter };

Этот код начинается с загрузки библиотекиnode-fetch и вашего файла настроек. Затем этот модуль предоставляет функциюpostImposter, которая отправляет фиктивные сообщения службы в Mountebank. Затемbody: определяет, что функция принимаетJSON.stringify(body), объект JavaScript. Этот объект - это то, что вы собираетесь передатьPOST сервису Mountebank. Поскольку этот метод работает локально, вы запускаете запрос к127.0.0.1 (localhost). Метод выборки принимает объект, отправленный в параметрах, и отправляет запросPOST кurl.

На этом шаге вы создали клиент Mountebank для публикации новых фиктивных сервисов на сервере Mountebank. На следующем шаге вы будете использовать этот клиент для создания вашей первой фиктивной службы.

[[step-5 -—- created-your-first-mock-service]] == Шаг 5. Создание вашей первой mock-службы

На предыдущих шагах вы создали приложение, которое создает сервер Mountebank и код для вызова этого сервера. Теперь пришло время использовать этот код для создания самозванца или фиктивного сервиса.

В Mountebank каждый самозванец содержитstubs. Заглушки - это наборы конфигурации, которые определяют ответ, который даст самозванец. Заглушки можно разделить на комбинацииpredicates and responses. Предикат - это правило, которое запускает ответ самозванца. Предикаты могут использовать множество различных типов информации, включая URL-адреса, содержимое запроса (с использованием XML или JSON) и методы HTTP.

Если смотреть с точки зрения приложенияModel-View-Controller (MVC), самозванец действует как контроллер, а заглушки как действия внутри этого контроллера. Предикаты - это правила маршрутизации, которые указывают на конкретное действие контроллера.

Чтобы создать свой первый фиктивный сервис, создайте файл с именемhello-service.js. Этот файл будет содержать определение вашей фиктивной службы.

Откройтеhello-service.js в текстовом редакторе:

nano hello-service.js

Затем добавьте следующий код:

app/src/hello-service.js

const mbHelper = require('./mountebank-helper');
const settings = require('./settings');

function addService() {
    const response = { message: "hello world" }

    const stubs = [
        {
            predicates: [ {
                equals: {
                    method: "GET",
                    "path": "/"
                }
            }],
            responses: [
                {
                    is: {
                        statusCode: 200,
                        headers: {
                            "Content-Type": "application/json"
                        },
                        body: JSON.stringify(response)
                    }
                }
            ]
        }
    ];

    const imposter = {
        port: settings.hello_service_port,
        protocol: 'http',
        stubs: stubs
    };

    return mbHelper.postImposter(imposter);
}

module.exports = { addService };

Этот код определяет самозванца с одной заглушкой, которая содержит предикат и ответ. Затем он отправляет этот объект на сервер Mountebank. Этот код добавит новую фиктивную службу, которая прослушивает запросыGET к корневому каталогуurl и возвращает{ message: "hello world" } при их получении.

Давайте посмотрим на функциюaddService(), которую создает предыдущий код. Во-первых, он определяет ответное сообщениеhello world:

    const response = { message: "hello world" }
...

Затем он определяет заглушку:

...
        const stubs = [
        {
            predicates: [ {
                equals: {
                    method: "GET",
                    "path": "/"
                }
            }],
            responses: [
                {
                    is: {
                        statusCode: 200,
                        headers: {
                            "Content-Type": "application/json"
                        },
                        body: JSON.stringify(response)
                    }
                }
            ]
        }
    ];
...

Эта заглушка состоит из двух частей. Часть предиката ищет запросGET к корневому (/) URL. Это означает, чтоstubs вернет ответ, когда кто-то отправит запросGET на корневой URL-адрес фиктивной службы. Вторая часть заглушки - это массивresponses. В этом случае есть один ответ, который возвращает результат JSON с кодом состояния HTTP200.

Последний шаг определяет самозванца, который содержит эту заглушку:

...
    const imposter = {
        port: settings.hello_service_port,
        protocol: 'http',
        stubs: stubs
    };
...

Это объект, который вы собираетесь отправить в конечную точку/imposters, чтобы создать самозванца, который имитирует службу с одной конечной точкой. Приведенный выше код определяет вашего самозванца, устанавливаяport на порт, который вы определили в файле настроек, устанавливаяprotocol на HTTP и назначаяstubs в качестве заглушек самозванца.

Теперь, когда у вас есть фиктивный сервис, код отправляет его на сервер Mountebank:

...
    return mbHelper.postImposter(imposter);
...

Как упоминалось ранее, Mountebank использует REST API для управления своими объектами. В предыдущем коде используется функцияpostImposter(), которую вы определили ранее, для отправки запросаPOST на сервер для активации службы.

Как только вы закончите сhello-service.js, сохраните и выйдите из файла.

Затем вызовите вновь созданную функциюaddService() вindex.js. Откройте файл в вашем текстовом редакторе:

nano index.js

Чтобы убедиться, что функция вызывается при создании экземпляра Mountebank, добавьте следующие выделенные строки:

app/src/index.js

const mb = require('mountebank');
const settings = require('./settings');
const helloService = require('./hello-service');

const mbServerInstance = mb.create({
        port: settings.port,
        pidfile: '../mb.pid',
        logfile: '../mb.log',
        protofile: '../protofile.json',
        ipWhitelist: ['*']
    });

mbServerInstance.then(function() {
    helloService.addService();
});

Когда создается экземпляр Mountebank, он возвращаетpromise. Обещание - это объект, который не определяет его ценность до позднего времени. Это может быть использовано для упрощения асинхронных вызовов функций. В предыдущем коде функция.then(function(){...}) выполняется при инициализации сервера Mountebank, что происходит, когда обещание выполняется.

Сохраните и выйдите изindex.js.

Чтобы проверить, что фиктивная служба создается при инициализации Mountebank, запустите приложение:

npm start

Процесс Node.js займет терминал, поэтому откройте новое окно терминала и отправьте запросGET наhttp://localhost:5001/:

curl http://localhost:5001

Вы получите следующий ответ, означающий, что сервис работает:

Output{"message": "hello world"}

Теперь, когда вы протестировали свое приложение, переключитесь обратно в первое окно терминала и выйдите из приложения Node.js, используяCTRL +C.

На этом этапе вы создали свой первый макетный сервис. Это тестовый макет службы, который возвращаетhello world в ответ на запросGET. Этот макет предназначен для демонстрационных целей; на самом деле он не дает вам ничего, чего вы не могли бы получить, создав небольшое приложение Express. На следующем шаге вы создадите более сложный макет, который использует некоторые функции Mountebank.

[[step-6 -—- building-a-data-backed-mock-service]] == Шаг 6. Создание макетной службы на основе данных

Хотя тип службы, созданной на предыдущем шаге, подходит для некоторых сценариев, для большинства тестов требуется более сложный набор ответов. На этом шаге вы создадите сервис, который берет параметр из URL и использует его для поиска записи в файле CSV.

Сначала вернитесь в основной каталогapp:

cd ~/app

Создайте папку с именемdata:

mkdir data

Откройте файл с данными о клиентах под названиемcustomers.csv:

nano data/customers.csv

Добавьте следующие тестовые данные, чтобы вашему фиктивному сервису было что извлечь:

app/data/customers.csv

id,first_name,last_name,email,favorite_color
1,Erda,Birkin,[email protected],Aquamarine
2,Cherey,Endacott,[email protected],Fuscia
3,Shalom,Westoff,[email protected],Red
4,Jo,Goulborne,[email protected],Red

Это поддельные данные о клиентах, созданные инструментом имитации APIMockaroo, похожие на поддельные данные, которые вы загружаете в таблицу клиентов в самой службе.

Сохраните и выйдите из файла.

Затем создайте новый модуль с именемcustomer-service.js в каталогеsrc:

nano src/customer-service.js

Чтобы создать самозванца, который прослушивает запросыGET на конечной точке/customers/, добавьте следующий код:

app/src/customer-service.js

const mbHelper = require('./mountebank-helper');
const settings = require('./settings');

function addService() {
    const stubs = [
        {
            predicates: [{
                and: [
                    { equals: { method: "GET" } },
                    { startsWith: { "path": "/customers/" } }
                ]
            }],
            responses: [
                {
                    is: {
                        statusCode: 200,
                        headers: {
                            "Content-Type": "application/json"
                        },
                        body: '{ "firstName": "${row}[first_name]", "lastName": "${row}[last_name]", "favColor": "${row}[favorite_color]" }'
                    },
                    _behaviors: {
                        lookup: [
                            {
                                "key": {
                                  "from": "path",
                                  "using": { "method": "regex", "selector": "/customers/(.*)$" },
                                  "index": 1
                                },
                                "fromDataSource": {
                                  "csv": {
                                    "path": "data/customers.csv",
                                    "keyColumn": "id"
                                  }
                                },
                                "into": "${row}"
                              }
                        ]
                    }
                }
            ]
        }
    ];

    const imposter = {
        port: settings.customer_service_port,
        protocol: 'http',
        stubs: stubs
    };

    return mbHelper.postImposter(imposter);
}

module.exports = { addService };

Этот код определяет макет службы, который ищет запросыGET с форматом URLcustomers/<id>. Когда запрос получен, он запросит URL дляid клиента, а затем вернет соответствующую запись из файла CSV.

Этот код использует на несколько больше возможностей Mountebank, чем сервисhello, который вы создали на последнем шаге. Во-первых, он использует функцию Mountebank под названиемbehaviors. Поведения - это способ добавить функциональность в заглушку. В этом случае вы используете поведениеlookup для поиска записи в файле CSV:

...
  _behaviors: {
      lookup: [
          {
              "key": {
                "from": "path",
                "using": { "method": "regex", "selector": "/customers/(.*)$" },
                "index": 1
              },
              "fromDataSource": {
                "csv": {
                  "path": "data/customers.csv",
                  "keyColumn": "id"
                }
              },
              "into": "${row}"
            }
      ]
  }
...

Свойствоkey использует регулярное выражение для анализа входящего пути. В этом случае вы беретеid, которое следует послеcustomers/ в URL-адресе.

СвойствоfromDataSource указывает на файл, который вы используете для хранения тестовых данных.

Свойствоinto вводит результат в переменную${row}. Эта переменная упоминается в следующем разделеbody:

...
  is: {
      statusCode: 200,
      headers: {
          "Content-Type": "application/json"
      },
      body: '{ "firstName": "${row}[first_name]", "lastName": "${row}[last_name]", "favColor": "${row}[favorite_color]" }'
  },
...

Переменная строки используется для заполнения тела ответа. В данном случае это строка JSON с данными клиента.

Сохраните и выйдите из файла.

Затем откройтеindex.js, чтобы добавить новый макет службы в вашу функцию инициализации:

nano src/index.js

Добавьте выделенную строку:

app/src/index.js

const mb = require('mountebank');
const settings = require('./settings');
const helloService = require('./hello-service');
const customerService = require('./customer-service');

const mbServerInstance = mb.create({
        port: settings.port,
        pidfile: '../mb.pid',
        logfile: '../mb.log',
        protofile: '../protofile.json',
        ipWhitelist: ['*']
    });

mbServerInstance.then(function() {
    helloService.addService();
    customerService.addService();
});

Сохраните и выйдите из файла.

Теперь запустите Mountebank сnpm start. Это скроет подсказку, поэтому откройте другое окно терминала. Проверьте свою службу, отправив запросGET кlocalhost:5002/customers/3. Это позволит найти информацию о клиенте вid3.

curl localhost:5002/customers/3

Вы увидите следующий ответ:

Output{
    "firstName": "Shalom",
    "lastName": "Westoff",
    "favColor": "Red"
}

На этом шаге вы создали фиктивную службу, которая считывает данные из файла CSV и возвращает их в виде ответа JSON. Отсюда вы можете продолжать создавать более сложные макеты, которые соответствуют сервисам, которые вам нужны для тестирования.

Заключение

В этой статье вы создали собственное приложение-сервис-имитатор, используя Mountebank и Node.js. Теперь вы можете создавать фиктивные сервисы и делиться ими со своей командой. Независимо от того, является ли это сложным сценарием, включающим в себя услугу поставщика, вам нужно проверить себя или просто издеваться, пока вы ждете, пока другая команда закончит свою работу, вы можете заставить свою команду двигаться, создавая имитационные сервисы.

Если вы хотите узнать больше о Mountebank, посмотрите ихdocumentation. Если вы хотите поместить это приложение в контейнер, посмотритеContainerizing a Node.js Application for Development With Docker Compose. Если вы хотите запустить это приложение в производственной среде, попробуйтеHow To Set Up a Node.js Application for Production on Ubuntu 18.04.

Related