Статьи

Модульное тестирование с FizzBuzz и JUnitParams

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

Одним из возможных решений FizzBuzz является:

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
public class FizzBuzz {
 
    private static final int THREE = 3;
    private static final int FIVE = 5;
 
    public String calculate(int number) {
        if (isDivisibleBy(number, THREE) && isDivisibleBy(number, FIVE)) {
            return "FizzBuzz";
        }
 
        if (isDivisibleBy(number, THREE)) {
            return "Fizz";
        }
 
        if (isDivisibleBy(number, FIVE)) {
            return "Buzz";
        }
 
        return String.valueOf(number);
    }
 
    private boolean isDivisibleBy(int dividend, int divisor) {
        return dividend % divisor == 0;
    }
}

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
@Parameters({"1", "2", "4", "7", "11", "13", "14"})
public void returnsNumberForNumberNotDivisibleByThreeAndFive(int number) {
    assertThat(fizzBuzz.calculate(number)).isEqualTo("" + number);
}
 
@Test
@Parameters({"3", "6", "9", "12", "18", "21", "24"})
public void returnFizzForNumberDivisibleByThree(int number) {
    assertThat(fizzBuzz.calculate(number)).isEqualTo("Fizz");
}
 
@Test
@Parameters({"5", "10", "20", "25", "35", "40", "50"})
public void returnBuzzForNumberDivisibleByFive(int number) {
    assertThat(fizzBuzz.calculate(number)).isEqualTo("Buzz");
}
 
@Test
@Parameters({"15", "30", "45", "60"})
public void returnsFizzBuzzForNumberDivisibleByThreeAndFive(int number) {
    assertThat(fizzBuzz.calculate(number)).isEqualTo("FizzBuzz");
}

Но мы могли бы также охватить все случаи в одном параметризованном методе тестирования:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@Test
@Parameters
public void fizzBuzz(int given, String expected) {
    assertThat(fizzBuzz.calculate(given)).isEqualTo(expected);
}
 
public Object[] parametersForFizzBuzz() {
    return $(
            $(1, "1"),
            $(2, "2"),
            $(3, "Fizz"),
            $(4, "4"),
            $(5, "Buzz"),
            $(6, "Fizz"),
            $(7, "7"),
            $(10, "Buzz"),
            $(15, "FizzBuzz"),
            $(30, "FizzBuzz")
    );
}

Наслаждайтесь JunitParams !

  • Взгляните на демонстрационный проект юнит-тестирования, представляющий различные аспекты юнит-тестирования, включая параметризованные тесты: https://github.com/kolorobot/unit-testing-demo