Статьи

Написание управляемых данными тестов для вашего Java-приложения

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

EasyTest — одна из таких платформ, основной задачей которой является внедрение функциональности Data Driven Testing в мир JUnit.

В JUnit уже есть какой-то механизм, который предоставляет пользователям своего рода тестирование на основе данных. Но это не достаточно, а также это не чисто. например, пользователь может использовать @Parameterized Runner для написания тестов, управляемых данными, но использование Parameterized Runner приводит к написанию большого количества ненужного кода.

EasyTest пытается решить проблемы, преодолевая разрыв между тем, что уже есть у JUnit, и тем, что наиболее удобно для пользователей.

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

Начиная

Чтобы начать работу с EasyTest, все, что вам нужно сделать, это загрузить файл JAR. Вы можете сделать это через Maven. Вот ссылка на последний JAR-файл easytest-core на Maven.

Как только вы загрузили файл JAR, вы готовы написать свой первый тест на основе данных. Вот пошаговое руководство по быстрому началу работы с модулем EasyTest Core.

Шаг 1 : Имейте последнюю зависимость EasyTest в вашем файле pom:

1
2
3
4
5
<dependency>
<groupId>org.easetech</groupId>
<artifactId>easytest-core</artifactId>
<version>1.3.2</version>
</dependency>

Шаг 2 : Создайте простой тестовый класс с тестовым методом

01
02
03
04
05
06
07
08
09
10
11
12
13
@RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths = { "testExcelData.xls" })
    public class TestExcelDataLoader{
     
      private ItemService itemService = new RealItemService();
 
    @Test
    public void getExcelTestData(@Param(name="libraryId")
    Float libraryId, @Param(name="itemId")
    Float itemId) {
        System.out.print("Executing getExcelTestData :");
        System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
    }

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

Вот еще один подробный пример использования доступных функций EasyTest:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
@RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths = { "testExcelData.xls" })
    @Format(date='dd/MM/yyyy')
    @Report
    @Parallel(threads=5)
    public class TestExcelDataLoader{
     
      @Duration(timeInMillis=1000)
      private ItemService itemService = new RealItemService();
 
    @Test
    public void getExcelTestData(@Param(name="libraryId")
    Float libraryId, @Param(name="itemId")
    Float itemId) {
        System.out.print("Executing getExcelTestData :");
        System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
    }

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@RunWith(DataDrivenTestRunner.class)
@TestPolicy(TestExcelDataPolicy.class)
public class TestExcelDataLoader{
 
  @Duration(timeInMillis=1000)
  private ItemService itemService = new RealItemService();
 
@Test
public void getExcelTestData(@Param(name="libraryId")
Float libraryId, @Param(name="itemId")
Float itemId) {
    System.out.print("Executing getExcelTestData :");
    System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
}

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

А вот как выглядит класс Policy TestExcelDataPolicy :

1
2
3
4
5
6
7
@DataLoader(filePaths = { "org/example/data/testExcelData.xls" })
     @Format(date='dd/MM/yyyy')
     @Report
     @Parallel(threads=5)
     public class TestExcelDataPolicy {
          
     }

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

После того, как вы определили свой тестовый класс, следующим шагом будет определение файла тестовых данных.

Шаг 3. Создайте файл тестовых данных (для приведенного выше примера это будет файл Excel с именем testExcelData.xls)
Первый столбец первой строки указывает название метода тестирования, для которого необходимо предоставить данные. 2-й и 3-й столбец 1-й строки представляет имя входных параметров для теста. Строки 2 и 3 представляют фактические данные испытаний.

1
2
3
4
5
getExcelTestData itemId libraryId
 
                         11567 91475
 
                          null         0

Поздравляю Вы только что написали свой первый тест на основе данных. Когда вы запускаете вышеуказанный тест с использованием IDE, поддерживаемой Junit, EasyTest сгенерирует 2 теста, по одному для каждого набора данных. Таким образом, вы просто избавились от написания разных тестов для тестирования с разными параметрами.

Далее давайте расширим этот пример и попытаемся понять некоторые дополнительные функции EasyTest .

Понимание поддержки контейнера IoC в EasyTest

Вместо того, чтобы определять / инициализировать свой testSubject (ItemService в вышеприведенном тесте) в самом классе теста, вы также можете экспортировать логику инициализации в файл конфигурации и внедрить нужный экземпляр во время выполнения. Преимущество этого состоит в том, что вы отделяете логику инициализации от логики теста, тем самым делая ваши тесты более чистыми и более удобными в обслуживании. Во-вторых, вы можете использовать внешнюю логику и в других тестах. Давайте посмотрим, как мы можем сделать это для вышеуказанного теста.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths = { "testExcelData.xls" })
    @TestConfigProvider({TestConfigProviderClass.class})
    public class TestExcelDataLoader{
     
      @Inject
      private ItemService itemService;
 
    @Test
    public void getExcelTestData(@Param(name="libraryId")
    Float libraryId, @Param(name="itemId")
    Float itemId) {
        System.out.print("Executing getExcelTestData :");
        System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
    }

Обратите внимание, что мы добавили две вещи к вышеупомянутым тестам:

  1. TestConfigProvider аннотация
  2. Вставить аннотацию

Аннотация TestConfigProvider принимает массив классов провайдера конфигурации, из которого загружаются компоненты. В приведенном выше примере TestConfigProviderClass.class будет выглядеть следующим образом:

1
2
3
4
5
public class TestConfigProviderClass {
     
    @TestBean public ItemService itemService(){
        return new RealItemService();
    }

Также обратите внимание, что мы используем стандартную аннотацию @Inject для внедрения тестового @Inject . EasyTest поддерживает @Inject для инъекции по типу, @Named вместе с @Inject для инъекции по имени. Помимо этого EasyTest также поддерживает инъекцию по имени поля. EasyTest также имеет собственную аннотацию @Provided в тех случаях, когда пользователь не использует или не может использовать аннотации Javax.

И это завершает этот пост в блоге. Я надеюсь, что смог рассказать вам о EasyTest и его возможностях. Пожалуйста, свяжитесь со мной по адресу [email protected], если у вас есть какие-либо вопросы или вопросы, или если вы хотите внести свой вклад в проект.