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

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

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

НО ЖДАТЬ! Я не просто хотел написать кучу

browser.click("myselector")

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

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

{
  "error": {
    "message": "Couldn't connect to selenium server",
    "stack": "Error: Couldn't connect to selenium server\n    at getHTML(\"html\", true) - chart-service.js:77:",
    "type": "RuntimeError",
    "seleniumStack": {
      "status": -1,
      "type": "ECONNREFUSED",
      "message": "Couldn't connect to selenium server",
      "orgStatusMessage": "Couldn't connect to selenium server"
    },
    "isBoom": true,
    "isServer": true,
    "data": null,
    "output": {
      "statusCode": 500,
      "payload": {
        "statusCode": 500,
        "error": "Internal Server Error",
        "message": "An internal server error occurred"
      },
      "headers": {}
    }
  }
}

Упс!! Я забыл запустить селен-сервер, чтобы можно было запустить эти тесты. Это было легко и быстро решено с помощью пакета npm selenium-standalone, который я также смог найти на сайте WebdriverIO. Как только я установил и запустил его (что почти не заняло времени), я смог запустить свои тесты и увидеть вход в браузер.

Когда я работал над своим первым набором тестов, самым важным было то, что я должен был убедиться, что этот набор тестов покрывает большую часть функциональности приложения, которое я тестировал. Я не хотел тратить уйму времени на написание этих тестов, так как писал их в нескольких разных фреймворках, так как хотел посмотреть, какой из них лучше всего подойдет для проекта, над которым я работал. Это означало, что мне пришлось придумать подмножество тестов, в которых использовались многие функции приложений, но на их написание и сборку у меня не ушло много времени. Чтобы выяснить, как лучше всего это сделать, я посмотрел на свой набор тестов, чтобы увидеть основные области приложения. Затем я сузил тесты, которые у меня были, на основе нашего критического пути приложения. Тестов по-прежнему было слишком много, чтобы написать их быстро, поэтому я посмотрел, как должен выглядеть типичный дымовой тест. Это также было немного больше, чем мне хотелось бы, поэтому я разбил все на часть дымового теста, который затрагивал самые основные функции, которые покрывали некоторые из более странных частей нашего приложения. Имея эти тесты в руках, я смог относительно быстро написать свой тест для проверки концепции, поскольку я работал в каждой из сред. На самом деле это было частью моих критериев для фреймворка. Насколько сложно мне было заставить тест работать? Этот процесс и то, как я выбрал фреймворк для работы, — это отдельная статья в другой раз.

После того, как я написал доказательство концепции, мне нужно было сделать несколько следующих шагов. Сначала мне нужно было попытаться запустить это в нескольких браузерах в WebdriverIO таким образом, чтобы CI мог выбирать, какой браузер запускать и когда его запускать. Во-вторых, я забыл сделать что-либо, что облегчило бы настройку и запуск в другом месте. На этот раз было легко запустить только мою машину. Если это собиралось использовать где-то в среде CI, мне нужно было сделать так, чтобы его можно было легко развернуть и запустить.

Я напишу об этом в своем следующем посте на WebDriverIO.