Аннотации в JUnit тестах

Далее пройдемся по основным аннотациям junit.

В скобках у аннотации Test можно указать число. Это число – это количество миллисекунд. Если метод будет выполняться больше этого количества миллисекунд, то программа сообщит об этом.

Таким образом можно протестировать производительность тестируемого метода.

Пример программы:

import org.junit.Assert; import org.junit.Test; public class TestCalc { // проверяет, что метод исполняется // не более 100 миллисекунд @Test(timeout = 100) public void testPow2() throws Exception { Calc calc = new Calc(); int result = 0; // Сделаем так чтобы тестовый // метод длился более 100 миллисекунд. // Хотя этот цикл было бы логичнее разместить // в тестируемом методе pow, так как мы тестируем его // производительность, а не тестового метода. for (int i = 0; i < 1000000; i++) { result = calc.pow(2, 4); } Assert.assertEquals(16, result); } }

Скомпилируем и запустим:

Видим, что программа сообщает нам о том, что метод выполнялся более 100 миллисекунд. Значит очевидно нужно налаживать производительность.


Аннотация @Ignore

Если в тестовом классе несколько тестовых методов, то мы можем отключать какие-либо из них с помощью аннотации Ignore

Пример программы:

import org.junit.Assert; import org.junit.Test; import org.junit.Ignore; public class TestCalc { @Test public void testPow() throws Exception{ Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(14, result); } //Также какой-либо тест можно отключить //(следующий тест за этой //аннотацией не запуститься). @Ignore @Test public void testPow1() throws Exception{ Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(16, result); } @Test(timeout=100) public void testPow2() throws Exception{ Calc calc = new Calc(); int result = 0; for(int i=0;i<1000000;i++){ result = calc.pow(2, 4); } Assert.assertEquals(16, result); } }

Компилируем и запускаем:

Как видим, хоть тестовых метода у нас три, а тестировалось всего дваTests run: 2. Так как второй тестовый метод мы отключили.


Аннотации @BeforeClass, @AfterClass

С помощью аннотации @BeforeClass можно создать метод, который будет выполнен единожды перед тем, как начнут выполняться тестовые методы, а с помощью аннотации @AfterClass можно создать метод, который будет выполнен единожды после того, как выполняться все тестовые методы.

Example

Зачем же нужны эти методы?

В случае с BeforeClass, чтобы, например, инициализировать какие-то данные, которые будут использоваться во всех тестах, в случае с AfterClass освободить какие-то ресурсы.

Пример программы:

import org.junit.Assert; import org.junit.Test; import org.junit.BeforeClass; import org.junit.AfterClass; public class TestCalc { //этот метод запускается перед тестовыми @BeforeClass public static void testBeforeClass() throws Exception{ System.out.println(“before all classes”); } //этот метод запускается после всех тестовых @AfterClass public static void testAfterClass() throws Exception{ System.out.println(“after all classes”); } @Test public void testPow() throws Exception{ System.out.println(“Test method 1”); Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(14, result); } @Test public void testPow1() throws Exception{ System.out.println(“Test method 2”); Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(16, result); } @Test(timeout=100) public void testPow2() throws Exception{ System.out.println(“Test method 3”); Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(16, result); } }

Компилируем и запускаем.

Видим, что сразу вывелось сообщение из метода помеченного @BeforeClass, потом сообщения тестовых методов, потом сообщение из метода помеченного @AfterClass.


Аннотации @Before, @After

С помощью аннотации @Before можно создать метод, который будет выполняться перед каждым тестовым методом, а с помощью аннотации @After можно создать метод, который будет выполняться после каждого тестового метода

Пример программы:

import org.junit.Assert; import org.junit.Test; import org.junit.Before; import org.junit.After; public class TestCalc { //этот метод запускается перед каждым тестовым @Before public void testBefore() throws Exception{ System.out.println(“before every class”); } //этот метод запускается после каждого тестового @After public void testAfter() throws Exception{ System.out.println(“after every class”); } @Test public void testPow() throws Exception{ System.out.println(“Test method 1”); Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(14, result); } @Test public void testPow1() throws Exception{ System.out.println(“Test method 2”); Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(16, result); } @Test(timeout=100) public void testPow2() throws Exception{ System.out.println(“Test method 3”); Calc calc = new Calc(); int result = calc.pow(2, 4); Assert.assertEquals(16, result); } }

Компилируем и запускаем.

Видим, что перед каждым сообщением из тестового метода выводилось сообщение из метода помеченного @Before, и также после каждого сообщения тестового метода выводилось сообщение из метода помеченного аннотацией @After.

Тестирование с Mockito

Mockito для тестирования Java-кода: mock и spy объекты, подмена зависимостей (stub), примеры тестирования методов с имитацией работы БД.
Time to read: 20

Логирование в Java с помощью log4j

Основы логирования в Java с log4j: запись ошибок в файл, настройка логгера и appender-ов, практические примеры для отладки приложений.
Time to read: 14

Настройка log4j логирования

Узнайте, как настроить логирование в Java с помощью log4j: уровни логирования, appender-ы для консоли, файлов и БД, настройка формата вывода через PatternLayout.
Time to read: 15