Лабораторная работа 1
"JUnit"
Цель – приобрести навыки работы с библиотекой тестирования "JUnit".
1. Теоретические сведения.
Процесс создания относительно сложных программных систем (работа над проектами) можно охарактеризовать следующим свойством:
- вероятности возникновения ошибок в программном коде существенно превышают таковые для случая написания более простых программ, когда не требуется задействовать коллектив программистов.
Проведение процедуры тестирования призвано уменьшить число ошибок в программном коде. С этой целью может быть использована библиотека классов "JUnit". Библиотека подключается к создаваемому проекту в качестве соответствующего Java-архива (junit-4.11.jar). "JUnit" можно рассматривать в качестве программного инструментария для написания и прогона тестов. Этот инструментарий также был портирован и на другие языки программирования [2]: C# (NUnit), C++ (CPPUnit), Fortran (fUnit), PHP (PHPUnit), JavaScript (JSUnit)…
Основные концепции JUnit приведены в табл. 1.
Таблица 1 – Назначения основных объектов (JUnit core objects)
Объект (класс) |
Описание |
Assert |
- определение утверждений, подлежащих тестированию (проверке); |
Test |
- аннотация "@Test" определяет метод как "тестовый"; |
TestCase |
- класс-контейнер для "@Test"-методов; |
Suite |
- средство группировки тестируемых классов; |
Runner |
- средство прогона тестов; |
Отдельного внимания заслуживает директива вида "@Test(timeout=var)", где "var" – значение в миллисекундах. Ее использование обосновано потребностью оценки временных издержек, связанных с получением результата работы тестируемого метода: если значение параметра "timeout" меньше оценочного значения, то тест автоматически расценивается как "failed".
Приведем некоторые из "Assert"-методов (табл. 2).
Таблица 2 – Методы сравнения объектов
Метод |
Назначение |
assertEquals(A, B); |
- проверка равенства объектов A и B; |
assertArrayEquals(A, B); |
- проверка равенства массивов; |
assertTrue(condition); |
- проверка истинности условия (логического высказывания); |
assertFalse(condition); |
- проверка ложности высказывания. |
Замечания к табл. 2:
- методы имеют тип "static void";
- если в качестве аргументов метода "assertEquals" выступают параметры типа "double", то вводится также 3-й аргумент ("deviation") как разница между значениями 1-го и 2-го аргументов: "assertEquals(double a, double b, deviation);".
Чтобы прогонять тесты несколько раз (с привязкой к различным наборам данных) проводят "параметризованное" тестирование. С этой целью используют директиву (аннотацию) "@RunWith": @RunWith(value=Parameterized.class). Помимо этого также необходимо предварить метод, возвращающий наборы данных, подлежащих анализу, директивой "@Parameterized.Parameters".
Чтобы использовать методы классов "Runner" и "Parameterized", необходимо импортировать следующие пакеты:
org.junit.runner.*;
org.junit.runners.*;
Класс "TestSuite" и группирование тестируемых классов: последняя выполняется с целью автоматизации процесса тестирования. В данном контексте корректно говорить о прогоне тестового набора ("suite").
Для вызова соответствующих методов необходимо импортировать следующие пакеты:
org.junit.runner.RunWith;
org.junit.runners.Suite;
Также следует использовать директиву "@RunWith(Suite.class)".