Software engineering Дмитриев Андрей Владиславович ©
Модульное тестирование с помощью JUnit Введение Установка Возможности JUnit Пример тестового покрытия Ссылки
Введение Понятие TDD (Test Driven Development). JUnit – это библиотека, позволяющая проводить модульное тестирование Java приложений.
Обоснование Пусть есть класс, реализующий несколько мат. функций. public class CustomMath { public static int sum(int x, int y){ return x+y; } public static int division(int x, int y){ if (y == 0) { throw new IllegalArgumentException("divider is 0 "); } return x/y; }}
Вариант модульного тестирования Некоторые проверки можно поместить в сам класс. Например, так: public class CustomMath { public static void main(String[] args) { if (sum(1, 3) == 4) { System.out.println("Test1 passed."); } else {System.out.println("Test1 failed.");} try { int z = division(1, 0); System.out.println("Test3 failed."); } catch (IllegalArgumentException e){ System.out.println("Test3 passed."); }}
Выводы Иногда требуется снабжать программу модульными тестами. Тесты неудобно хранить в самой программе. Внешняя библиотека, подключенная к проекту может существенно облегчить разработку и поддержание unit тестов.
Установка Сайт проекта: После распаковки и настройки переменных окружения: varshome.html Библиотека может быть использована в совокупности с любой Java программой. Модуль JUnit входит в большинство популярных IDE.
Возможности JUnit import junit.framework.*; //подключение библиотеки //Тест должен быть наследником класса TestCase public class CustomMathTest extends TestCase { //тестирующие методы начинаются с test public void testSum() { System.out.println("sum"); int x = 0; int y = 0; int expResult = 0; int result = CustomMath.sum(x, y); //проверка условия на совпадение assertEquals(expResult, result); fail("The test case is a prototype."); } Автоматическая генерация тестов порождает следующий шаблон.
Возможности JUnit (cont.) В конце обычно происходит сравнение фактического результата с ожидаемым. //тестирующие методы начинаются с test public void testDivision() { System.out.println("division"); int x = 0; int y = 0; int expResult = 0; int result = CustomMath.division(x, y); //проверка условия на совпадение assertEquals(expResult, result); fail("The test case is a prototype."); }
Настоящий тестовый случай Один из тестов может выглядеть так: public void testSum() { System.out.println("sum"); int x = 1; int y = 3; int expResult = 4; int result = CustomMath.sum(x, y); assertEquals(expResult, result); }
Обработка исключений Запуск теста для метода division(x, y) выдал ошибку: Testcase: testDivision(simplemathapp.CustomMathTest):Caused an ERROR divider is null java.lang.IllegalArgumentException: divider is null at simplemathapp.CustomMath.division(CustomMath.java:42) at simplemathapp.CustomMathTest.testDivision(CustomMathTest.jav a:38)
Обработка исключений (cont.) Причина в том, что тест некорректно обрабатывает деление на ноль: public void testDivision() { System.out.println("division"); int x = 0; int y = 0; int expResult = 0; int result = CustomMath.division(x, y); assertEquals(expResult, result); } Вместо сравнения числовых результатов нужно ожидать исключение.
Обработка исключений (cont.) В случае исключения мы не делаем ничего. Если исключения нет – сообщаем об ошибке. public void testDivision() { int x = 0; int y = 0; int expResult = 0; try { int result = CustomMath.division(x, y); fail("Exception expected"); } catch (IllegalArgumentException e){ System.out.println("pass"); }
Перспективы Версия JUnit 4.0 доступна на сайте проекта: использует аннотации, отслеживает истечение времени, возможность определять методы инициализации тестовой сюиты.
Ограничения Невозможность моделирования многопоточных ситуаций.
Выводы Наличие хорошего набора тестов важно для контроля качества программы. Разработка тестов может отнимать немного времени. Автоматизация тестов – главный приоритет для успешного тестирования.
Ссылки
Q&A
Дмитриев Андрей Владиславович © Спасибо!