CodeceptJS — современный инструмент для автоматизации End 2 End тестирования. Он позволяет описывать тесты на DSL высокого уровня. Сами тесты будут выполнятся одной из популярных библиотек на выбор: Playwright, Webdriver (Selenium), Protractor.

logo.svg

Проблема

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

Допустим, мне нужно написать тест страницы авторизации. На Java с Selenium код будет выглядеть так:

package puvtests;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class OpenPageTest {
    public static void main(String[] args) {
				System.setProperty("webdriver.chrome.driver","G:\\\\chromedriver.exe");
    	
				WebDriver driver = new ChromeDriver();
        String baseUrl = "<https://puv-test2-int-elk-01.otr.ru:18080/>";
        String expectedTitle = "Puv";
        String actualTitle = "";

        driver.get(baseUrl);

        actualTitle = driver.getTitle();
        if (actualTitle.contentEquals(expectedTitle)){
            System.out.println("Test Passed");
        } else {
            System.out.println("Test Failed");
        }
       
        driver.close();
    }
}

В коде много конструкций, которые на самом деле не нужны тесту. Они нужны самому языку.

Решение

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

Scenario('open page', ({ I }) => {
  I.amOnPage('<https://puv-test2-int-elk-01.otr.ru:18080/>')
  I.seeTitleEquals('Puv')
});

Основным элементом тестов в Codecept является актёр, обозначаемый как I. Весь процесс описывается с точки зрения актёра в виде пошагового сценария:

  1. Я на странице puv-test2-int-elk-01.otr.ru:18080;
  2. Я вижу, что заголовок равняется Puv;

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

А если сложнее?

Окей, с простыми тестами понятно. А если надо написать сложный тест? Например, описать реальный механизм авторизации. Без проблем:

Scenario('login with login and password', ({ I }) => {
  I.amOnPage('<https://puv-test2-int-elk-01.otr.ru:18080/sign-in>')
  I.fillField('Имя пользователя', 'Login')
  I.fillField('Пароль', 'Password')
  I.click('Войти')
  I.click('Меры 2021, соцконтракт')
  I.see('Управление Пенсионного фонда РФ в г.Курске Курской области')
});
// Даже боюсь представить как это будет выглядеть на Selenium 🙃.

Вроде всё хорошо, но авторизация — процедура, которую придётся повторять перед каждым тестом. Поэтому было бы полезно вынести её в отдельную функцию. Для этого Codecept предоставляет steps_file, в котором можно прописать дополнительные функции для актёра I.

Изначально steps_file выглядит так:

module.exports = function() {
  return actor({})
}

Добавим в него функцию авторизации: