11. Управляем параметрами в коде и в Jenkins - qa-guru/knowledge-base GitHub Wiki

Зачем это нужно

Зачастую тесты разрабатываются на локальной машине QA-инженера, но запускаются на удаленном сервере. Бывает, что и тесты запускает вовсе не тестировщик, а разработчик. Поэтому всем участникам команды необходимо дать возможность быстро взаимодействовать с кодовой базой тестов без необходимости погружаться в код, изучать его и вносить в него изменения. В этом поможет понятие системных свойств (System Properties) в Java.

System Properties

setProperty()

С помощью метода setProperty() можно задавать значения для элементов внутреннего хранилища Java. Значения хранятся по принципу «ключ-значение» и задаются в таком же порядке.

System.setProperty("browser", "safari");
// ключу с именем browser присвоили значение safari

getProperty()

Метод getProperty() позволяет получать значения ключей. В качестве параметра необходимо передать имя ключа.

// Задаем значение
System.setProperty("browser", "safari");

// Записываем значение ключа browser в строковую переменную
String browser = System.getProperty("browser");
// Печатаем в консоль значение переменной
System.out.println(browser); // В консоль выйдет: safari

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

String browser = System.getProperty("browser", "chrome");

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

String browser = System.getProperty("browser", "chrome");
String version = System.getProperty("version", "101");
String windowSize = System.getProperty("windowSize", "1920x1080");

Как это использовать для запуска тестов

Сперва необходимо добавить в Gradle-файл следующую строчку. Без нее параметры из командной строки не будут передаваться в скрипт сборки.

tasks.withType(Test) {
    systemProperties(System.getProperties())

    // Скорее всего у вас тут будет что-то еще 
    ...
    ...
    ...
}

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

gradle clean <testTag>

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

@Test 
@Tag("test1")
void test1() {
    ...
    ...
    ...
}

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

gradle clean test1 -Dbrowser=opera -Dversion=99 -DwindowSize=400x500

Если выполнить команду, то тест запустится с указанными параметрами.

gradle clean test1

Если не указывать параметры, то тест запустится с дефолтными значениями, которые мы установили выше. Наши дефолтные значения:

  • browser: chrome
  • version: 101
  • windowSize: 1920x1080

Как передать параметры в Jenkins

Необходимо перейти в настройки сборки Jenkins и найти пункт «Параметризованная сборка». В этом пункте следует выбрать «Добавить параметр».

Далее выбираем «Choice parameter» задаем имя (BROWSER), в вариантах указываем названия (chrome, firefox, opera).

Спускаемся к пункту Tasks и указываем «-Dbrowser=${BROWSER}». Не забываем сохранить изменения.

Теперь, если перейти во вкладку «Собрать с параметрами», которая ранее была просто «Собрать сейчас», то мы увидим возможность выбрать браузер для сборки. Важно помнить, что можно задавать несколько параметров, следуя по шагам алгоритма выше.

Библиотека Owner

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

Как подключить

В Gradle-файл добавляем следующее:

dependencies {
    testImplementation(
            "org.aeonbits.owner:owner:1.0.12",
    )
}

Работа с Owner

Сначала надо создать и заполнить файл из которого мы будем брать данные. Файл создается по следующему пути:
src -> test -> resources -> config -> credentials.properties
Расширение файла обязательно должно быть .properties.

Далее в файле указываем все необходимые данные следующим образом:

login=admin
password=admin

Чтобы все это заработало необходимо создать класс CredentialsConfig в папке config и заполнить его таким образом:

@Config.Sources("classpath:config/credentials.properties")
public interface CredentialsConfig extends Config {
    String login();
    String password();
}

А в классе теста следует создать экземпляр класса CredentialsConfig и тогда мы сможем обращаться к данным из Owner-файла.

public class OwnerTests {
    CredentialsConfig config = ConfigFactory.create(CredentialsConfig.class);

    @Test
    @Tag("owner")
    void loginTest() {
        String login = config.login();
        String password = config.password();
    }
}

Owner-файл также можно добавить в сборку Jenkins.

⚠️ **GitHub.com Fallback** ⚠️