Руководство Node.js, которое поможет вам не пропускать интеграционные тесты

  1. Модульные тесты против интеграционных тестов: вам нужны оба
  2. Интеграционные тесты
  3. Установите пакет для интеграционных тестов
  4. Указания, которым нужно следовать при написании интеграционных тестов
  5. Повторяющиеся тесты
  6. Тестирование соответствующих действий
  7. Приемлемый тест и утверждение
  8. Простая настройка теста
  9. Избегайте тестирования стороннего кода
  10. Оставьте производственный код свободным от тестового кода
  11. Соответствующее ведение журнала
  12. Хорошие тесты выглядят чистыми и понятными
  13. Вспомогательные компоненты
  14. Управление потоком
  15. Тестирование Framework
  16. Заводская библиотека
  17. Подключение к API
  18. Другие утилиты
  19. Не очень простые тесты
  20. Начните писать интеграционные тесты

Интеграционные тесты - это не то, чего стоит бояться. Они являются неотъемлемой частью полного тестирования вашего приложения.

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

Вы знаете, что вам нужно написать интеграционные тесты, так почему вы этого не делаете?

В этой статье вы узнаете, как писать читаемые и компонуемые интеграционные тесты с примерами в приложениях на основе API.

Пока мы будем использовать JavaScript / Node.js для всех примеров кода в этой статье большинство обсуждаемых идей можно легко адаптировать к интеграционным тестам на любой платформе.

Модульные тесты против интеграционных тестов: вам нужны оба

Модульные тесты сосредоточены на одной конкретной единице кода. Часто это конкретный метод или функция большего компонента.

Эти тесты выполняются изолированно, где все внешние зависимости обычно заглушаются или проверяются.

Другими словами, зависимости заменяются заранее запрограммированным поведением, гарантирующим, что результат теста определяется только правильностью тестируемой единицы.

Вы можете узнать больше о модульных тестах Вот ,

Модульные тесты используются для поддержания качественного кода с хорошим дизайном. Они также позволяют нам легко покрывать угловые случаи.

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

Интеграционные тесты

Если модульные тесты определяются путем тестирования наименьших блоков кода изолированно, то интеграционные тесты являются прямо противоположными.

Интеграционные тесты используются для тестирования нескольких более крупных узлов (компонентов) во взаимодействии, а иногда даже могут охватывать несколько систем.

Целью интеграционных тестов является поиск ошибок в соединениях и зависимостях между различными компонентами, такими как:

  • Передача неверных или неправильно упорядоченных аргументов
  • Сломанная схема базы данных
  • Неправильная интеграция с кешем
  • Недостатки в бизнес-логике или ошибки в потоке данных (потому что тестирование теперь выполняется в более широком представлении).

Если компоненты, которые мы тестируем, не имеют сложной логики (например, компоненты с минимальным цикломатическая сложность ), интеграционные тесты будут гораздо важнее модульных тестов.

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

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

Юнит-тесты и интеграционные тесты похожи на две стороны одной медали. Монета не действительна без обоих.

Поэтому тестирование не будет завершено, пока вы не завершите интеграцию и модульные тесты.

Установите пакет для интеграционных тестов

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

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

Иногда интеграционные тесты должны использовать эти внешние сервисы и компоненты, а иногда их можно поставить в тупик.

Когда они необходимы, это может привести к нескольким проблемам.

  • Хрупкое выполнение теста: внешние службы могут быть недоступны, возвращать неверный ответ или находиться в недопустимом состоянии. В некоторых случаях это может привести к ложному срабатыванию, в других случаях может привести к ложному отрицанию.
  • Медленное выполнение: подготовка и подключение к внешним службам может быть медленным. Обычно тесты выполняются на внешнем сервере как часть CI ,
  • Сложная настройка теста: внешние службы должны находиться в желаемом состоянии для тестирования. Например, база данных должна быть предварительно загружена необходимыми тестовыми данными и т. Д.

Указания, которым нужно следовать при написании интеграционных тестов

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

Повторяющиеся тесты

Порядок или зависимости теста не должны изменять результат теста. Запуск одного и того же теста несколько раз должен всегда возвращать один и тот же результат. Этого может быть трудно достичь, если тест использует Интернет для подключения к сторонним сервисам. Тем не менее, эта проблема может быть решена путем заглушки и насмешек.

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

Тестирование соответствующих действий

Для проверки всех возможных случаев, модульные тесты являются гораздо лучшим вариантом.

Интеграционные тесты больше ориентированы на связь между модулями, следовательно, тестирование счастливые сценарии обычно это путь, потому что он будет охватывать важные связи между модулями.

Приемлемый тест и утверждение

Один быстрый просмотр теста должен проинформировать читателя о том, что тестируется, как настроена среда, что ставится в тупик, когда выполняется тест и что утверждается. Утверждения должны быть простыми и использовать помощников для лучшего сравнения и регистрации.

Простая настройка теста

Приведение теста в исходное состояние должно быть максимально простым и понятным.

Избегайте тестирования стороннего кода

Хотя сторонние сервисы могут использоваться в тестах, нет необходимости их тестировать. И если вы им не доверяете, вы, вероятно, не должны их использовать.

Оставьте производственный код свободным от тестового кода

Производственный код должен быть чистым и понятным. Смешивание тестового кода с производственным кодом приведет к соединению двух неподключаемых доменов.

Соответствующее ведение журнала

Неудачные тесты не очень полезны без хорошей регистрации.

Когда тесты пройдены, дополнительная регистрация не требуется. Но когда они терпят неудачу, обширная регистрация жизненно важна.

Ведение журнала должно содержать все запросы к базе данных, запросы и ответы API, а также полное сравнение того, что утверждается. Это может значительно облегчить отладку.

Хорошие тесты выглядят чистыми и понятными

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

const co = require ('co'); const test = require ('blue-tape'); const factory = require ('фабрика'); const superTest = require ('../ utils / super_test'); const testEnvironment = require ('../ utils / test_environment_preparer'); const path = '/ v1 / admin / recipes'; test (`API GET $ {path}`, co.wrap (function * (t) {yield testEnvironment.prepare (); const recipe1 = yield factory.create ('recipe'); const recipe2 = yield factory.create (' recipe '); const serverResponse = yield superTest.get (path); t.deepEqual (serverResponse.body, [recipe1, recipe2]);}));

Приведенный выше код тестирует API (GET / v1 / admin / recipes), который ожидает, что он вернет массив сохраненных рецептов в качестве ответа.

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

Вспомогательные компоненты облегчают написание понятных интеграционных тестов.

Давайте рассмотрим, какие компоненты необходимы для интеграционного тестирования.

Вспомогательные компоненты

Комплексный пакет тестирования включает в себя несколько основных компонентов, в том числе: управление потоком, инфраструктуру тестирования, обработчик базы данных и способ подключения к API бэкэнда.

Управление потоком

Одной из самых больших проблем в тестировании JavaScript является асинхронный поток.

Обратные звонки могут сеять хаос в коде и обещаний просто не хватает. Здесь помощники потока становятся полезными.

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

Колорадо позволяет красиво писать код, в то же время не блокируя его. Это делается путем определения функции генератора с последующим получением результатов.

Другое решение заключается в использовании певчая птица , Bluebird - это библиотека обещаний, которая имеет очень полезные функции, такие как обработка массивов, ошибок, времени и т. Д.

Сопрограммы Co и Bluebird ведут себя аналогично async / await в ES7 (ожидание разрешения перед продолжением), с той лишь разницей, что он всегда будет возвращать обещание, что полезно для обработки ошибок.

Тестирование Framework

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

В JavaScript существует множество платформ для тестирования. В наших примерах мы используем лента , Лента, на мой взгляд, не только отвечает этим требованиям, но и чище и проще, чем другие тестовые среды, такие как Mocha или Jasmin.

Лента основана на Протестируйте что угодно протокол (TAP) ,

TAP имеет вариации для большинства языков программирования.

Лента принимает тесты в качестве входных данных, запускает их, а затем выводит результаты в виде TAP. Затем результат TAP может быть передан в тестовый репортер или может быть выведен на консоль в необработанном формате. Лента запускается из командной строки.

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

Заводская библиотека

Заводская библиотека позволяет вам заменять файлы статических приборов гораздо более гибким способом создания данных для теста. Такая библиотека позволяет определять модели и создавать объекты для этих моделей без написания сложного кода.

JavaScript имеет factory_girl для этого - библиотека, вдохновленная драгоценный камень с похожим названием , который был первоначально разработан для Ruby on Rails.

const factory = require ('фабрикант'). factory; const User = require ('../ models / user'); factory.define ('user', User, {username: 'Bob', number_of_recipes: 50}); const user = factory.build ('user');

Для начала новая модель должна быть определена в factory_girl.

Он указывается с помощью имени, модели из вашего проекта и объекта, из которого создается новый экземпляр.

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

При создании нового экземпляра модели мы можем:

  • Переопределить любое значение во вновь созданном экземпляре
  • Передайте дополнительные значения в опцию функции построения

Давайте посмотрим на пример.

const factory = require ('фабрикант'). factory; const User = require ('../ models / user'); factory.define ('user', User, (buildOptions) => {return {name: 'Mike', фамилия: 'Dow', электронная почта: buildOptions.email || ' [электронная почта защищена] '}}); const user1 = factory.build ('user'); // {"name": "Mike", "фамилия": "Dow", "email": " [электронная почта защищена] "} const user2 = factory.build ('user', {name: 'John'}, {email: ' [электронная почта защищена] «}); // {"name": "John", "фамилия": "Dow", "email": " [электронная почта защищена] «}

Подключение к API

Запуск полноценного HTTP-сервера и создание фактического HTTP-запроса только для того, чтобы разорвать его через несколько секунд - особенно при проведении нескольких тестов - совершенно неэффективно и может привести к тому, что интеграционные тесты будут занимать значительно больше времени, чем необходимо.

Supertest библиотека JavaScript для вызова API без создания нового активного сервера Он основан на SuperAgent, библиотеке для создания TCP-запросов. С этой библиотекой нет необходимости создавать новые соединения TCP. API-интерфейсы вызываются практически мгновенно.

SuperTest, с поддержкой обещаний, является Supertest-в обещанном , Когда такой запрос возвращает обещание, он позволяет вам избежать нескольких вложенных функций обратного вызова, что значительно упрощает обработку потока.

const express = require ('express') const request = require ('supertest-as-обещано'); const app = express (); request (app) .get ("/ recipes"). then (res => assert (....));

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

Другие утилиты

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

SinonJS отличная библиотека, которая поддерживает шпионов, заглушек и издевательства для тестов. Он также поддерживает другие полезные функции тестирования, такие как время изгиба, тестовая песочница и расширенное утверждение, а также поддельные серверы и запросы.

В некоторых случаях необходимо высмеивать некоторую зависимость в нашем коде. Ссылки на сервисы, которые мы хотели бы высмеять, используются другими частями системы.

Чтобы решить эту проблему, мы можем использовать внедрение зависимости или, если это не вариант, мы можем использовать сервис насмешки, такой как Mockery.

издевательство помогает издеваться над кодом, который имеет внешние зависимости. Чтобы использовать его правильно, Mockery следует вызывать перед загрузкой тестов или кода.

const mockery = require ('издевательство'); mockery.enable ({warnOnReplace: false, warnOnUnregistered: false}); const mockingStripe = require ('lib / services / internal / stripe'); mockery.registerMock ('lib / services / internal / stripe', mockingStripe);

С помощью этой новой ссылки (в этом примере mockingStripe) проще в дальнейшем проверять службы в наших тестах.

const stubStripeTransfer = sinon.stub (mockingStripe, 'TransferAmount'); stubStripeTransfer.returns (Promise.resolve (нуль));

С помощью библиотеки Sinon легко издеваться. Единственная проблема здесь в том, что эта заглушка будет распространяться на другие тесты. Для песочницы можно использовать песочницу sinon. С его помощью последующие тесты могут вернуть систему в исходное состояние.

const sandbox = require ('sinon'). sandbox.create (); const stubStripeTransfer = sandbox.sinon.stub (mockingStripe, 'TransferAmount'); stubStripeTransfer.returns (Promise.resolve (нуль)); // после теста или лучше при запуске нового теста sandbox.restore ();

Необходимы другие компоненты для таких функций, как:

  • Очистка базы данных (можно сделать одним предварительным запросом иерархии)
  • Установка в рабочее состояние ( sequelize-светильники )
  • Ложные TCP-запросы к сторонним сервисам ( натягивать тетиву )
  • Используя более богатые утверждения ( Chai )
  • Сохраненные ответы третьих лиц ( легко затруднительного )

Не очень простые тесты

Абстракция и расширяемость являются ключевыми элементами построения эффективного интеграционного тестового набора. Все, что снимает фокус с ядра теста (подготовка его данных, действие и утверждение), следует сгруппировать и абстрагировать в служебные функции.

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

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

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

const co = require ('co'); const factory = require ('фабрика'); const superTest = require ('../ utils / super_test'); const basicEnv = require ('../ utils / basic_test_enivornment'); const path = '/ v1 / admin / recipes'; basicEnv.test (`API POST $ {path}`, co.wrap (function * (t, assert, sandbox) {const chef = yield factory.create ('chef'); const body = {chef_id: chef.id, recipe_name: 'cake', Ingredients: ['carrot', 'chocolate', 'biscuit']}; const stub = sandbox.stub (mockery.emailProvider, 'sendNewEmail'). ReturnPromise (null); const serverResponse = yield superTest. get (путь, тело); assert.spies (заглушка) .called (1); assert.statusCode (serverResponse, 201);}));

Вышеприведенный тест повторяется, поскольку каждый раз начинается с чистой окружающей среды.

Он имеет простой процесс установки, где все, что связано с настройкой, объединяется в функции basicEnv.test.

Он тестирует только одно действие - один API. И в нем четко изложены ожидания теста с помощью простых утверждений. Кроме того, в тесте не задействован сторонний код путем заглушки / насмешек.

Начните писать интеграционные тесты

При внедрении нового кода в производство разработчики (и все остальные участники проекта) хотят быть уверены, что новые функции будут работать, а старые не сломаются.

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

Интеграционные тесты в сочетании с юнит-тестами являются первой линией защиты.

Использование только одного из двух недостаточно и оставит много места для обнаруженных ошибок. Постоянное использование обоих сделает новые коммиты надежными, обеспечит уверенность и внушит доверие всем участникам проекта.

Похожие

Управление информацией WHOIS ваших доменов
Этот учебник охватывает следующие темы: Очень важно постоянно обновлять административную информацию о вашем домене, чтобы избежать каких-либо проблем с властями регистратора домена. Если ваш домен зарегистрирован SiteGround, вы можете легко редактировать всю административную информацию прямо из Зона пользователя → Мои учетные записи → Управление рядом с предпочтительным доменом.
Google против Yandex в России
... ите на цифры, с этим трудно поспорить"> И когда вы смотрите на цифры, с этим трудно поспорить. Существует множество возможных причин, почему это так, но давайте перейдем к погоне и рассмотрим основные различия между двумя поисковыми системами. Чтобы объяснить, как работает Яндекс по сравнению с Google, и ответить на некоторые часто задаваемые вопросы о том, как лучше всего оптимизировать веб-сайт для Яндекса, мы разделили статью на четыре части: Факторы ранжирования
Галерник - как сделать собственную фотогалерею в интернете
Вам не нужно знать о создании сайтов PixExpose Галерник не требует никаких знаний HTML для создания фотогалереи. Вы просто выбираете фотографии, шаблон,
Тест Symantec Norton Antivirus 2006: наше мнение
Версия Norton Antivirus 2006 года включает отслеживание программ-шпионов для защиты. Эта функция, тем не менее, менее интегрирована, чем в McAfee VirusScan 2006 кто осуществляет априорное наблюдение за подозрительными программами. Кроме того, исчез элегантный и высокофункциональный интерфейс версии Norton Antivirus 2005 года. Несмотря на эти две критики, Norton AntiVirus 2006 является обновлением,
WikiZero
открытый дизайн википедии. Тип последовательного интерфейса перевод USB 1.1: до 1,5 МБ / с USB 2.0: до 60 МБ / с USB 3.1 поколения 1: до 625 МБ / с [1] USB 3.1 поколения 2: до 1,25 ГБ / с Длина USB
Какой браузер Windows 10 лучший? Тесты в
... тесты производительности на Asus CM6730. Этот настольный ПК оснащен процессором Intel Core i7-3770 3,4 ГГц третьего поколения. Это поддерживается видеокартой Nvidia GeForce GT 620. ПК также имеет 8 ГБ оперативной памяти и один жесткий диск TeraByte. В этой системе, кроме последних версий Edge (25) и IE 11, я тестировал последние версии самых популярных настольных веб-браузеров. Это Chrome 49 ,
Мото G 3 против Мото G 2: вы должны обновить?
... или Мото G 2? Мы потратили довольно много времени на бюджетных Android-телефонах Motorola, изучая различия, чтобы сказать вам, стоит ли обновлять Мы закончили наш обзор Мото G 3 (2015) и наш вердикт заключается в том, что это еще один замечательный Android-телефон от Motorola. Мы также сказали то же самое о Moto G 2
Prisma - приложение, которое превращает фотографии в изображения
Prisma - это новое приложение, которое уже приобрело огромную популярность. Благодаря этому каждая картина может получить уникальный блеск и выглядеть так, как будто она была написана известными художниками. Prisma это одно из новых приложений, доступных для мобильных устройств с операционной системой iOS. Казалось бы, казалось бы, это еще одна программа для быстрого редактирования фотографий. В некотором смысле, но Prisma это тоже нечто большее.
Подарок к 50-летию - Персональные книги и другие подарки
Семейные хроники, книги по случаю 18-летия или 50-летия - наша новая специализация. Я просто готовлю следующий сюжет: историю довольно большой семьи, и я хотел бы поделиться несколькими мыслями и идеями.
ТЕСТ: Sony Xperia M5
Sony Xperia M5 попала в редакцию несколько дней назад. Большинству извинят за ошибку этой новой модели и более старой Sony Xperia Z3 Выпуск. Это просто сбивает с толку. Таким образом, он не следует новым и немного другим дизайнерским линиям Sony. Xperia Z5 Сериал это одновременно. Выдерживает норвежские штормы Sony
Sony Xperia Z5 Compact: тест, цена и технические характеристики
Теперь, с каждым новым поколением смартфона Sony Xperia Z, появляется его компактная модель. В этом году Xperia Z5 Compact появляется и даже пропускает поколение коробки и Z4, как и Z3 Compact, прямой потомок Z1 Compact. «Z5C» происходит по-прежнему сплетен в законных сомнениях в отношении его интересов, если только по своему техническому оборудованию, близкого к много критики и забываются Z3 + и его противоречивым большой брат, Xperia Z5. Тем не менее, благодаря счастливому соединению планет,

Комментарии

Итак, вам интересно, как сделать сайт?
Итак, вам интересно, как сделать сайт? Лучшее: в одиночку, бесплатно и быстро? Вы пришли в нужное место. Потратьте около десятка минут, чтобы прочитать это руководство, благодаря которому вы узнаете, как сделать сайт бесплатно. Создание сайтов проще, чем вы думаете! В этом руководстве вы узнаете: - Как сделать сайт за несколько минут с помощью создателя сайта. - Как сделать сайт самостоятельно, не платя тысячи злотых компании, которая
А что если мы введем ключевое слово в поисковой системе, которое очень часто ищется, и мы не найдем фильм строго по заданной теме?
А что если мы введем ключевое слово в поисковой системе, которое очень часто ищется, и мы не найдем фильм строго по заданной теме? Ну, мы нашли плодородную почву! Ничего, просто опубликуйте! После выбора правильных ключевых слов для вашего видео, вы можете перейти к этапу добавления его на YouTube. Помните, что
Вам нужно проверить модель вашей материнской платы?
Вам нужно проверить модель вашей материнской платы? Самый простой способ посмотреть на коробку ... хуже, если мы ее выбросили или потеряли. К счастью, есть и другие способы проверить вашу материнскую плату и не включать поиск коробки от шкафов.
Если ЗДЕСЬ больше не будет разрабатываться, зачем вам обращаться за помощью к устаревшему программному стеку?
Если ЗДЕСЬ больше не будет разрабатываться, зачем вам обращаться за помощью к устаревшему программному стеку? И затем, почему вы запускаете программу, которая не имеет надлежащей навигации? В чем смысл? Плюс единицы по умолчанию для языковых настроек. В моих случаях американский английский = мили. Нет нет Нет Нет. Я хочу км. Это глупо.
Не удивительно ли, почему мы не видим, кто отвечает за трансляцию той или иной рекламы, которая появляется на нашем дисплее?
Не удивительно ли, почему мы не видим, кто отвечает за трансляцию той или иной рекламы, которая появляется на нашем дисплее? Почему для рекламы нет whois, если она работает без проблем для доменов? Ответ прост: потому что те, кто его создают, часто не хотят его подписывать. Так почему же крупные сайты, такие как o2 или Przegląd Sportowy, соглашаются транслировать рекламу противника? Я спросил обе компании об этом, но я получил только один ответ: Мы и наши партнеры
Нужно распечатывать электронные билеты на концерт, в театр, на экскурсию и другие меры?
Нужно распечатывать электронные билеты на концерт, в театр, на экскурсию и другие меры? Электронные билеты на концерты, в театры, на экскурсии и другие мероприятия обязательно необходимо распечатывать, так как на билете задано уникальный штрих-код для контроля. Непосредственно в месте проведения мероприятия сотрудник сканирует Ваш билет для пропуска на событие. Где хранятся мои заказы? Где я могу найти билеты для печати? Не
Какая команда PowerShell позволяет вам удаленно настраивать vSwitch?
Какая команда PowerShell позволяет вам удаленно настраивать vSwitch? Как настроить виртуальную машину так, чтобы она могла общаться только с внутренней сетью, а не с Интернетом? Любой из этих вопросов звучит знакомо? Если так, продолжайте читать. У меня есть ответы! Что такое виртуальный коммутатор в Hyper-V? Hyper-V vSwitch является программно-определяемым переключателем
Что предлагают хорошие и дешевые ноутбуки для игроков?
Что предлагают хорошие и дешевые ноутбуки для игроков? Хорошие и дешевые игры для ноутбуков должны, в первую очередь, дать нам достойную основу для последующего расширения, потому что нацеленность на ноутбуки для игроков до 3000 злотых со свечой придет вам, чтобы искать устройства, оснащенные даже твердотельными накопителями, что сегодня является совершенно базовой вещью. Поэтому наш поиск будет сосредоточен на поиске правильной базовой аппаратной конфигурации,
Я думаю, что лучше останавливаться на сообщениях без картинок, потому что плохие фотографии дают хорошие фотографии этого форума?
Я думаю, что лучше останавливаться на сообщениях без картинок, потому что плохие фотографии дают хорошие фотографии этого форума? Петр Чачуа (пиотрекчача) на форуме с мая 2006 года, заявления № 2290 Ян, я думаю, он не пропустит никого, кто обеспокоен даже самыми серьезными фотографиями на этом форуме. Если кто-то обратит на это ваше внимание, тогда только
Вам понравилась эта статья?
Вам понравилась эта статья? Поделись с другими!
Вам нужен многофункциональный принтер для браслетов, который идеально интегрируется с системой, работающей в вашей компании?
Вам нужен многофункциональный принтер для браслетов, который идеально интегрируется с системой, работающей в вашей компании? Выберите TDP-225W ! Скидка 430,50 зл. Купить сейчас 1 349 00 злотых нетто 1 659 27 злотых брутто 1 699 00 злотых нетто 2 089 77 злотых брутто Цена Этот принтер даст вам

Вы знаете, что вам нужно написать интеграционные тесты, так почему вы этого не делаете?
Или Мото G 2?
Итак, вам интересно, как сделать сайт?
Лучшее: в одиночку, бесплатно и быстро?
А что если мы введем ключевое слово в поисковой системе, которое очень часто ищется, и мы не найдем фильм строго по заданной теме?
Вам нужно проверить модель вашей материнской платы?
Если ЗДЕСЬ больше не будет разрабатываться, зачем вам обращаться за помощью к устаревшему программному стеку?
Если ЗДЕСЬ больше не будет разрабатываться, зачем вам обращаться за помощью к устаревшему программному стеку?
И затем, почему вы запускаете программу, которая не имеет надлежащей навигации?
В чем смысл?