Свързване на рамката JUnit

За тестване на Java code имаме страхотна рамка, наречена JUnit . Работи страхотно, постоянно се актуализира, много е популярен и разбира се Intellij IDEA е много тясно интегриран с него.

Сега всички използват петата version на тази рамка - JUnit 5 , въпреки че в много проекти все още можете да намерите четвъртата й version. Не са много по-различни, но все пак ще разгледаме най-новия. Мисля, че докато започнеш активно да пишеш тестове, ще одобриш избора ми.

И така, How да добавите JUnit към проекта? След като научите Maven, ще бъде лесно: просто добавете този code към вашия pom.xml:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
	<version>5.8.1</version>
	<scope>test</scope>
</dependency>

Между другото, ако искате Maven да изпълнява вашите тестове на етапа на изграждане ( тестов етап ), тогава трябва да добавите още един фрагмент към pom.xml:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
	<version>2.19.1</version>
	<dependencies>
    	<dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.3.2</version>
    	</dependency>
	</dependencies>
</plugin>

@Test анотация

Да приемем, че имате клас, който искате да тествате. Кой е най-добрият начин да направите това? Нека започнем с пример, защото е трудно да се тества абстрактен клас :)

Да предположим, че имаме клас Calculator , който може да изпълнява 4 основни операции: събиране, изваждане, умножение и деление. Нека го напишем:

class Calculator {
    	public int add(int a, int b) {
        	return a+b;
    	}

    	public int sub(int a, int b) {
        	return a-b;
    	}

    	public int mul (int a, int b) {
        	return a*b;
    	}

    	public int div(int a, int b) {
        	return a/b;
    	}
}

Искаме да тестваме методите на този клас. Никога не се знае, в бъдеще ще променят нещо и всичко ще спре да работи. Как можем да напишем тестове за него?

Трябва да създадем друг клас. За да направят това, те обикновено вземат същото име и добавят суфикса Test . За всеки метод трябва да добавите поне един тестов метод. Пример:

class CalculatorTest {
   	@Test
    	public void add() {
    	}
   	@Test
    	public void sub() {
        }
   	@Test
    	public void mul() {
    	}
   	@Test
    	public void div() {
    	}
}

Преди имаше изискване името на метода да започва с думата test , но това вече не се изисква.

Примери за JUnit тестове

Нека напишем няколко примера, в които ще тестваме методите на нашия клас CalculatorTest :

class CalculatorTest {
   	@Test
    	public void add() {
        	Calculator calc = new Calculator();
        	int result = calc.add(2, 3);
        	assertEquals(5, result);
    	}

   	@Test
    	public void sub() {
        	Calculator calc = new Calculator();
        	int result = calc.sub(10, 10);
        	assertEquals(0, result);
        }

   	@Test
    	public void mul() {
        	Calculator calc = new Calculator();
        	int result = calc.mul(-5, -3);
        	assertEquals(15, result);
    	}

   	@Test
    	public void div() {
        	Calculator calc = new Calculator();
        	int result = calc.div(2, 3);
        	assertEquals(0, result);
    	}
}

Ето How изглежда един типичен JUnit тест. От интересното: тук се използва специалният метод assertEquals() : той сравнява подадените към него параметри, Howто е посочено от думата равно в името му.

Ако параметрите, предадени на assertEquals() , не са равни, методът ще хвърли изключение и тестът ще бъде неуспешен. Това изключение няма да попречи на други тестове да се изпълняват.