Модульное тестирование (Unit Testing)

Тестирование можно проводить в разном масштабе.

Пирамида тестирования позволяет визуально представить соотношение количества тестов разного уровня к сложности их создания.

Модульное тестирование — самый простой по сложности и объемный по количеству тестов уровень. Обычно модульные тесты пишут разработчики в процессе реализации какой-либо доработки (фичи).

Цель модульного тестирования — проверка корректности работы каждого модуля (функции, класса) в изоляции, а также обнаружение и исправление дефектов на ранних стадиях разработки.

testing-levels

Пирамида тестирования


Функция для тестирования

Примерим на себя роль разработчика. Напишем функцию сложения двух целых чисел sum.

При разработке будем использовать псевдокод — неформальный, более лёгкий для восприятия код.

c sum (a, b) {

    объявить переменную c

    выполнить сложение a + b
    результат сложения записать в переменную c

    вернуть переменную c
}

Псевдокод

public int sum(int a, int b) {

    int c;


    c = a + b;


    return c;
}

Код на языке программирования Java


Пример модульного теста

Модульный тест (Unit Test) описывает ожидаемый и фактический результат выполнения функции.
Если ожидаемый и фактический результаты совпали, значит тест прошел успешно PASS, иначе тест провален FAIL.

int expected = 3; //ожидаемый результат

int actual = sum(1, 2); //фактический результат

expected == actual;

PASS

== знак логического равенства

int expected = 2147483648;

int actual = sum(2147483646, 2);

expected != actual;

FAIL

!= знак логического неравенства

На подумать: Целочисленное переполнение


Покрытие кода тестами


Полнота проведённого тестирования измеряется таким показателем, как покрытие кода тестами (code coverage), причём 100%-ое покрытие не даёт гарантии отсутствия багов. Оно лишь показывает, какая часть кода фактически выполняется при прогоне теста.

На рисунке строка 9 подсвечена красным, так как не была покрыта тестом. То есть функция sum ни разу не была вызвана с аргументами a и b, сумма которых удовлетворяла бы условию на строке 8.

unit-tests

Отображение информации о покрытии кода тестами в среде разработки IntelliJ IDEA


Задача

Изучите функцию sum и введите значения аргументов, которые позволят добиться 100%-го покрытия кода.

Обратите внимание, что используемый целочисленный тип данных int может вмещать минимальное значение -2147483647 и максимальное значение 2147483647.

Если выйти за рамки значений результат будет неожиданным и некорректным.

Верных вариантов ответа может быть несколько.

public int sum(int a, int b) {

    if (a + b > 2147483646) {
        out.println("Be careful with big numbers!");
    }

    int c = a + b;

    return c;
}