Пришло время, когда разработчик модульных тестов имел возможность запускать тесты параллельно с использованием аннотаций. В сегодняшнем сообщении в блоге мы рассмотрим, как можно заставить ваши традиционные тесты Junit работать параллельно, используя аннотации, предоставленные Easytest. Easytest представляет собой среду тестирования, основанную на JUnit, которая упрощает написание и сопровождение ваших тестов. Он сфокусирован на написании управляемых данными тестов для вашего приложения.
Давайте начнем с предположения, что Class ItemService имеет методы метода 2:
- getItems, который принимает 2 аргумента Double itemId и String itemType. Класс API описан ниже.
- 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
|
BEFORERun testGetItemsAFTERBEFORERun testGetItemsAFTERBEFORERun testUpdateItemAFTERBEFORERun testUpdateItemAFTER |
ШАГ 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
|
BEFOREBEFORERun testGetItemsBEFORERun testUpdateItemAFTERRun testGetItemsBEFOREAFTERRun testUpdateItemAFTERAFTER |
Как видно из вышеприведенного вывода консоли, тесты выполняются параллельно друг другу, и поэтому вы видите такой вывод распределенной консоли.
Вывод
В приведенном выше примере мы увидели, как теперь вы можете запускать свои тесты в параллельном режиме. Также при сборке ваших тестов из инструментов сборки, таких как Maven, тесты будут работать в параллельном режиме. Это большой стимул для сценариев, где у вас есть тысячи юнит-тестов, и они требуют минут для запуска.
EasyTest работает над подходом командной строки / системных параметров для включения / выключения функции параллельного интерфейса. Оставайтесь в курсе.