Тестирование в Java с помощью JUnit

JUnitэто библиотека для тестирования отдельных частей кода, в частности — методов.

Когда мы реализовали какой-то метод, нам всегда нужно его протестировать. Правильно? Потому что если мы запустим код где много непротестированных методов, то мы получим много ошибок, в которых разбираться будет очень сложно.

Или если мы уже запустили такой непроверенный код, то нам нужно как-то его чинить. Ошибки можно находить проходясь по методам кода тестами.

Можно задаться вопросом, зачем нужна библиотека JUNIT, если можно вывести результат работы какого-либо метода просто в main через консоль например?

Дело в том, что JUnit делает процесс тестирования проще и добавляет доп. функциональность для доп. удобства тестирования.

Допустим у нас есть класс, в котором мы создали метод pow и теперь ходим его протестировать

Класс Clac:

public class Calc { //Функция возведения в степень public int pow(int num, int power){ int result=1; for(int i=0; i < power; i++) {result *= num;} return result; } }

Теперь нужно создать отдельный класс для тестирования методов этого класса Calc с помощью JUNIT.

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

import org.junit.Assert; import org.junit.Test; //Названия классов тестеров принято называть //начиная Test и заканчивая именем класса, который //тестируем то есть в данном случае класса Calc. public class TestCalc { @Test //Помечаем что это метод для теста. //Функция для проверки метода возведения в степень. //имя метода тестера тоже = test потом имя метода, //который тестируем. public void testPow() throws Exception{ Calc calc = new Calc(); int result = calc.pow(2, 4); //Метод assertEquals сообщает совпадает ли //значение, которое вернул метод pow //со значением, которое ожидает программист. //Слева значение, которое ожидаем, //справа фактическое. Assert.assertEquals(16, result); } }

Для того чтобы скомпилировать файл с тестами нужно сначала скачать два файлаhamcrest-core-1.3.jar и junit-4.13.2.jar. Оба довольно легко можно найти в интернете.

В консоли компилируем файл с тестами с использованием скачанных файлов:

javac -cp .;hamcrest-core-1.3.jar;junit-4.13.2.jar TestCalc.java.

И потом запускаем этот файл вместе с файлом JUnitCore, который находиться в этих библиотеках:

java -cp .;hamcrest-core-1.3.jar;junit-4.13.2.jar org.junit.runner.JUnitCore TestCalc

Запускать нужно всегда с этим файлом иначе программа не запуститься.

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

Программа сообщает нам, что всё ОК. То есть ожидаемое значение совпадает с фактическим. Значит метод работает корректно.

Теперь давайте изменим ожидаемое значение и посмотрим, что будет.

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

import org.junit.Assert; import org.junit.Test; //Названия классов тестеров принято называть //начиная Test и заканчивая именем класса, который //тестируем то есть в данном случае класса Calc. public class TestCalc { @Test //Помечаем что это метод для теста. //Функция для проверки метода возведения в степень. //имя метода тестера тоже – test потом имя метода, //который тестируем. public void testPow() throws Exception{ Calc calc = new Calc(); int result = calc.pow(2, 4); //Метод assertEquals сообщает совпадает ли //значение, которое вернул метод pow //со значением, которое ожидает программист. //Слева значение, которое ожидаем, //справа фактическое. Assert.assertEquals(14, result); } }

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

Как видим, программа нам сообщает, что значение, которое вернул метод pow (вернул 16) не совпадает со значением, которое ожидал программист (ожидал 14), что значит что метод работает не правильно и программист должен идти его исправлять.

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

Например, можно передать третьим параметром в него число отклонения фактического значения вот так:

Assert.assertEquals(16, result, 2);

То есть если фактическое значение было например 15 или 14, то тестовый метод скажет, что всё ОК, так как 15 и 14 не заходят за приделы отклонения от числа 16 на 2. Заходят числа, которые больше 18 и меньше 14.

Также из полезных методов стоит упомянуть метод assertArrayEquals. То же самое, что и assertEquals, но сравнивает два массива а не два значения.

Также есть assertTrue, assertFalse – проверяют вернул ли проверяемый метод truе, false соответственно.

Также есть еще несколько других методов, но они все очень простые, особого смысла демонстрировать их нет, можно почитать о них в документации.

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

Изучите основные аннотации JUnit: @Test, @Ignore, @Before, @After. Узнайте, как тестировать производительность методов и управлять выполнением тестов в Java.

Time to read: 18

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

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

Time to read: 20

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

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

Time to read: 14