Статьи

JUnit4 Параметризованные и Примеры Теорий

Я всегда полагался на TestNG, чтобы передать параметры в методы тестирования, чтобы придать немного гибкости моим тестам или наборам.

Однако такая же гибкость может быть достигнута с помощью JUnit4.

Чтобы использовать это просто:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.marco.test;
 
import java.util.Arrays;
 
import java.util.Collection;
 
import junit.framework.Assert;
 
import org.junit.Test;
 
import org.junit.runner.RunWith;
 
import org.junit.runners.Parameterized;
 
import org.junit.runners.Parameterized.Parameters;
 
@RunWith(Parameterized.class)
 
public class ParameterizedTest {
 
@Parameters
 
public static Collection data() {
 
return Arrays.asList(new Object[][] {
 
/* Sport Nation year totWinners */
 
{ “basket”, “usa”, 2002, 5, },
 
{ “soccer”, “argentina”, 2003, 2 },
 
{ “tennis”, “spain”, 2004, 10 },
 
{ “chess”, “ireland”, 2005, 0 },
 
{ “eatingbananas”, “italy”, 2006, 20 }
 
});
 
}
 
private final String sport;
 
private final String nation;
 
private final int year;
 
private final int totWinners;
 
public ParameterizedTest(String sport, String nation, int year, int totWinners) {
 
this.sport = sport;
 
this.nation = nation;
 
this.year = year;
 
this.totWinners = totWinners;
 
}
 
@Test
 
public void test() {
 
Assert.assertTrue(isDataCorrect(sport, nation, year, totWinners));
 
}
 
private boolean isDataCorrect(String sport2, String nation2, int year2, int totWinners2) {
 
return true;
 
}
 
}

JUnit создаст экземпляр класса ParameterizedTest и запустит метод testCombination () (или любой метод, помеченный как @Test) для каждой строки, определенной в статической коллекции.

Теории

Это еще одна интересная особенность от JUnit4, которая мне нравится. Теории в JUnit 4 используются для тестирования комбинаций входов с использованием одного и того же метода тестирования:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.marco.test;
 
import static org.hamcrest.CoreMatchers.is;
 
import java.math.BigDecimal;
 
import org.junit.Assert;
 
import org.junit.Assume;
 
import org.junit.experimental.theories.DataPoint;
 
import org.junit.experimental.theories.Theories;
 
import org.junit.experimental.theories.Theory;
 
import org.junit.runner.RunWith;
 
@RunWith(Theories.class)
 
public class TheoryTest {
 
@DataPoint
 
public static int MARKET_FIRST_GOALSCORERE_ID = 2007;
 
@DataPoint
 
public static int MARKET_WDW_ID = 2008;
 
@DataPoint
 
public static BigDecimal PRICE_BD = new BigDecimal(6664.0);
 
@DataPoint
 
public static double PRICE_1 = 0.01;
 
@DataPoint
 
public static double PRICE_2 = 100.0;
 
@DataPoint
 
public static double PRICE_3 = 13999.99;
 
@Theory
 
public void lowTaxRateIsNineteenPercent(int market_id, double price) {
 
Assume.assumeThat(market_id, is(2008));
 
Assume.assumeThat(price, is(100.0));
 
// run your test
 
Assert.assertThat(price, is(100.0));
 
}
 
@Theory
 
public void highTaxRateIsNineteenPercent(int market_id, double price) {
 
Assume.assumeThat(market_id, is(2007));
 
Assume.assumeThat(price, is(13999.99));
 
Assert.assertThat(price, is(13999.99));
 
}
 
@Theory
 
public void highTaxRateIsNineteenPercent(int market_id, BigDecimal price) {
 
Assume.assumeThat(market_id, is(2007));
 
Assert.assertThat(price, is(BigDecimal.valueOf(6664)));
 
}
 
}

На этот раз вам нужно пометить тестовый класс как @RunWith (Theories.class) и использовать @DataPoint для определения свойств, которые вы хотите протестировать.

JUnit будет называть рынок методов как @Theory, используя все возможные комбинации на основе предоставленной DataPoint и типа переменной. PRICE_BD DataPoint будет использоваться только в последнем методе, единственный, который принимает BigDecimal в параметрах своего метода.

Только параметры, которые удовлетворяют условию Assume.assumeThat (), будут проходить через проверку asser. Комбинации, которые не удовлетворяют условию Assume.assumeThat (), будут игнорироваться молча.

Ссылка: JUnit4 Parameterized and Theories от нашего партнера по JCG Марко Кастильего из блога Удалить дубликаты и исправить дурные имена .