Check#

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

Добавить в maven/dependencies#
     <dependency>
         <groupId>ru.tinkoff.qa.neptune</groupId>
         <artifactId>check</artifactId>
         <version>${LATEST_RELEASE_OR_BETA_VERSION}</version>
         <scope>test</scope>
     </dependency>

     <!--Минимально необходимый набор зависимостей от hamcrest-->
     <dependency>
         <groupId>org.hamcrest</groupId>
         <artifactId>${artefact.name.from.hamcrest.group}</artifactId>
         <version>${actual.hamcrest.version}</version>
         <scope>test</scope>
     </dependency>
Добавить в build.gradle#
 dependencies {
     testImplementation  group: 'ru.tinkoff.qa.neptune', name: 'check', version: LATEST_RELEASE_OR_BETA_VERSION
     testImplementation group: 'org.hamcrest', name: 'artefact.name.from.hamcrest.group', version: 'actual.hamcrest.version'
 }

API

Простая проверка значения#
import static org.hamcrest.Matchers.*;
import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.check;
import static ru.tinkoff.qa.neptune.check.MatchAction.match;

public class MyTest {

    @Test
    public void tezt() {
        int number; //= алгоритм и действия, чтобы получить число
        check(number, match(greaterThan(0)));

        //пример с пояснением. Оно должно описывать, ЧТО проверяется
        check("Число, которое было получено",
             number,
             match(greaterThan(0)));
    }

}
Множественная проверка значения#
import static org.hamcrest.Matchers.*;
import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.check;
import static ru.tinkoff.qa.neptune.check.MatchAction.match;

public class MyTest {

    @Test
    public void tezt() {
        int number; //= алгоритм и действия, чтобы получить число
        check(number,
                match(greaterThan(0)),
                match(lessThan(1000))); //Работает по принципу soft assert
        //т.е. будут проведены ВСЕ перечисленные выше проверки.
        //Если какие-то проверки не были успешными, тогда
        //в логе/отчете будут выведены неуспешные проверки по отдельности,
        //в самом конце выполнения метод check выбросит AssertError, в сообщении
        //которого будет агрегированная информация о всех неуспешных проверках

        //пример с пояснением. Оно должно описывать, ЧТО проверяется
        check("Число, которое было получено",
                number,
                match(greaterThan(0)),
                match(lessThan(1000)));
    }

}
Проверка значения матчерами, объединенными в OR-выражение#
import static org.hamcrest.Matchers.*;
import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.check;
import static ru.tinkoff.qa.neptune.check.MatchAction.match;
import static ru.tinkoff.qa.neptune.check.MatchAction.matchAny;

public class MyTest {

    @Test
    public void tezt() {
        int number; //= алгоритм и действия, чтобы получить число
        check(number,
                match(greaterThan(0)),
                //перечисляются 2 и более критерия.
                //Проверяемые значения должны соответствовать любому/любым из них
                matchAny(lessThan(1000), greaterThanOrEqualTo(200)));

        //пример с пояснением. Оно должно описывать, ЧТО проверяется
        check("Число, которое было получено",
                number,
                match(greaterThan(0)),
                matchAny(lessThan(1000), greaterThanOrEqualTo(200)));
    }

}
Проверка значения матчерами, объединенными в NOT-выражение#
import static org.hamcrest.Matchers.*;
import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.check;
import static ru.tinkoff.qa.neptune.check.MatchAction.match;
import static ru.tinkoff.qa.neptune.check.MatchAction.matchNot;

public class MyTest {

    @Test
    public void tezt() {
        int number; //= алгоритм и действия, чтобы получить число
        check(number,
                match(greaterThan(0)),
                //перечисляются 1 и более критерия.
                // Проверяемые значения не должны соответствовать ни одному из них
                matchNot(lessThan(1000)));

        //пример с пояснением. Оно должно описывать, ЧТО проверяется
        check("Число, которое было получено",
                number,
                match(greaterThan(0)),
                matchNot(lessThan(1000)));
    }

}
Проверка значения матчерами, объединенными в XOR-выражение#
import static org.hamcrest.Matchers.*;
import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.check;
import static ru.tinkoff.qa.neptune.check.MatchAction.match;
import static ru.tinkoff.qa.neptune.check.MatchAction.matchOnlyOne;

public class MyTest {

    @Test
    public void tezt() {
        int number; //= алгоритм и действия, чтобы получить число
        check(number,
                match(greaterThan(0)),
                //перечисляются 2 и более критерия.
                // Проверяемые значения должны соответствовать только одному из них
                matchOnlyOne(lessThan(1000)), greaterThan(100));

        //пример с пояснением. Оно должно описывать, ЧТО проверяется
        check("Число, которое было получено",
                number,
                match(greaterThan(0)),
                matchOnlyOne(lessThan(1000)), greaterThan(100));
    }

}

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

Проверки с использованием времени#
import static java.time.Duration.ofSeconds;
import static org.hamcrest.Matchers.*;
import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.check;
import static ru.tinkoff.qa.neptune.check.MatchAction.match;

public class MyTest {

    @Test
    public void tezt() {
        T obj; //= инициализация
        check(obj, match(ofSeconds(5), matcher)); //указывается время,
        // за которое проверка должна завершиться успешно

        //пример с пояснением. Оно должно описывать, ЧТО проверяется
        check("Проверяемый объект",
             obj,
             match(ofSeconds(5), matcher));

        //аналогично для matchAny, matchNot, matchOnlyOne
    }

}
Проверка не самого значения, а производного от него результата#
import static java.time.Duration.ofSeconds;
import static org.hamcrest.Matchers.*;
import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.check;
import static ru.tinkoff.qa.neptune.check.MatchAction.match;

public class MyTest {

    @Test
    public void tezt() {
        Integer number; //= алгоритм и действия, чтобы получить число
        check(number,
                match(greaterThan(0)),
                match("Квадратный корень", //пояснение, ЧТО проверяется
                      number -> sqrt(number.doubleValue()), //функция для получения
                      //проверяемой производной величины
                      greaterThan(2D))); //матчер

        //пример с пояснением. Оно должно описывать, ЧТО проверяется
        check("Число, которое было получено",
                number,
                match(greaterThan(0)),
                match("Квадратный корень", //пояснение, ЧТО проверяется
                      number -> sqrt(number.doubleValue()), //функция для получения
                      //проверяемой производной величины
                      greaterThan(2D))); //матчер

        //пример для кейса, когда нужно указать время
        Object obj; //= инициализация
        check("Проверяемый объект",
                obj,
                match("Какое-то вычислимое свойство",
                        o -> o.returnSomething(),
                        //указывается время,
                        ofSeconds(5), // за которое проверка
                        //должна завершиться успешно
                        matcher)); //матчер

        //аналогично для matchAny, matchNot, matchOnlyOne
    }

}
Вычисление значения вместе с проверкой#
 import static org.hamcrest.Matchers.*;
 import static ru.tinkoff.qa.neptune.check.CheckActionSupplier.evaluateAndCheck;
 import static ru.tinkoff.qa.neptune.check.MatchAction.match;

 public class MyTest {

     @Test
     public void tezt() {
         //Данная фича нужна скорее для красоты лога/отчета.
         //Шаг с проверкой скрывает внутри себя под-шаги,
         //часть из которых - вычисление проверяемого значения,
         //остальные - проверки
         evaluateAndCheck("Полученное число", () -> {
                     //алгоритм и действия, чтобы получить число
                     return number;
                 },
                 match(greaterThan(0)),
                 match(lessThan(1000)));
     }

 }