Статьи

Запускайте свои модульные тесты параллельно

Пришло время, когда разработчик модульных тестов имел возможность запускать тесты параллельно с использованием аннотаций. В сегодняшнем сообщении в блоге мы рассмотрим, как можно заставить ваши традиционные тесты Junit работать параллельно, используя аннотации, предоставленные Easytest. Easytest представляет собой среду тестирования, основанную на JUnit, которая упрощает написание и сопровождение ваших тестов. Он сфокусирован на написании управляемых данными тестов для вашего приложения.

Давайте начнем с предположения, что Class ItemService имеет методы метода 2:

  1. getItems, который принимает 2 аргумента Double itemId и String itemType. Класс API описан ниже.
  2. updateItem, который принимает экземпляр Item и обновляет его в базе данных.
1
2
3
4
5
6
7
public class ItemService {
 
   public List getItems (Double itemId , String itemType);
 
   public void updateItem (Item item);
 
}

Мы оставим реализацию ради простоты примера.

Давайте рассмотрим пошаговый подход к написанию параллельных модульных тестов.

ШАГ 1:

Загрузите последнюю версию (или версию 1.2 и выше) EasyTest из Центрального репозитория Maven .

ШАГ 2:

Далее, давайте напишем простой модульный тест для вышеуказанных бизнес-методов, используя аннотации EasyTest и подход, основанный на данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@RunWith(DataDrivenTestRunner.class)
@DataLoader(filePaths="getItemData.csv")
@TestConfigProvider(TestConfigProvider.class)
public class ItemServiceTest {
 
     @Inject
     private ItemService itemService;
 
     @Before
     public void before() {
         System.out.println("BEFORE");
     }
 
     @Test
     public List testGetItems(@Param(name="itemId")Double itemId , @Param(name="itemType")String itemType) {
        
          //Actual test conditions here
           System.out.println("Run testGetItems");
 
     }
 
     @Test
     public void testUpdateItem(@Param(name="item") Item item) {
        
          //Actual test conditions here
          System.out.println("Run testUpdateItem");
 
     }
 
    @After
     public void after() {
         System.out.println("AFTER");
     }
}

В приведенном выше примере используются существующие функции EasyTest, такие как предоставление данных в тестовом файле с использованием аннотаций CDI для внедрения тестовых компонентов. Если вы хотите узнать больше о @TestConfigProvider и Dependency Injection в EasyTest, вы можете увидеть мой предыдущий пост в блоге. Если вы хотите узнать больше о том, как писать тесты, управляемые данными, в целом с помощью EasyTest, посетите страницы EasyTest на WIKI .

Выше приведен пример запуска простого модульного теста, управляемого данными. Все вышеперечисленные тесты будут выполняться последовательно, один за другим. Предполагая, что каждый из тестовых методов имеет два набора тестовых данных, указанных в файле getItemData.csv, при запуске вышеуказанного теста в консоли мы получаем следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
BEFORE
Run testGetItems
AFTER
 
BEFORE
Run testGetItems
AFTER
 
BEFORE
Run testUpdateItem
AFTER
 
BEFORE
Run testUpdateItem
AFTER

ШАГ 3:

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@RunWith(DataDrivenTestRunner.class)
@DataLoader(filePaths="getItemData.csv")
@TestConfigProvider(TestConfigProvider.class)
@Parallel(threads=2)
public class ItemServiceTest {
 
     @Inject
     private ItemService itemService;
 
     @Before
     public void before() {
         System.out.println("BEFORE");
     }
 
     @Test
     public List testGetItems(@Param(name="itemId")Double itemId , @Param(name="itemType")String itemType) {
        
          //Actual test conditions here
           System.out.println("Run testGetItems");
 
     }
 
     @Test
     public void testUpdateItem(@Param(name="item") Item item) {
        
          //Actual test conditions here
          System.out.println("Run testUpdateItem");
 
     }
 
    @After
     public void after() {
         System.out.println("AFTER");
     }
}

Обратите внимание на аннотацию @Parallel на нижнем уровне.

Когда этот тест запущен, вывод консоли выглядит примерно так (он может отличаться при запуске того же теста):

01
02
03
04
05
06
07
08
09
10
11
12
BEFORE
BEFORE
Run testGetItems
BEFORE
Run testUpdateItem
AFTER
Run testGetItems
BEFORE
AFTER
Run testUpdateItem
AFTER
AFTER

Как видно из вышеприведенного вывода консоли, тесты выполняются параллельно друг другу, и поэтому вы видите такой вывод распределенной консоли.

Вывод

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

EasyTest работает над подходом командной строки / системных параметров для включения / выключения функции параллельного интерфейса. Оставайтесь в курсе.

Ссылка: Проведите свои модульные тесты параллельно с нашим партнером JCG Ануджем Кумаром в блоге блога JavaWorld .