Что представляет собой JUnit

Что представляет собой JUnit

JUnit – это фреймворк (готовый набор инструментов), который используется во время автоматического юнит-тестирования программного обеспечения. Пакет включает в себя набор определенных правил и функций, дающих возможность без лишних проблем создавать и запускать тесты. При его помощи программист может убедиться в том, что каждый раздел кода или модуль, который отвечает за ту или иную функцию приложения, работает именно так, как задумано.

На данный момент актуальной версией JUnit является пятая. Пакет включает в себя три модуля:

  • JUnit Platform ― базовое программное обеспечение, позволяющее управлять тестированием.

  • JUnit Jupiter ― нужен, чтобы система могла пользоваться возможностями Java 8. Модуль предоставляет API на основе аннотаций и дает возможность создавать или запускать динамические и модульные тесты.

  • JUnit Vintage ― необходим для того, чтобы инструмент мог работать с тестами, созданными при помощи прежних версий JUnit.

Главное преимущество этого фреймворка – возможность тонко настраивать параметры тестирования, что ощутимо упрощает работу программиста или тестировщика. К примеру, они могут группировать тесты по функциональности, проверяемым модулям или степени критичности. Также служба позволяет задавать условия запуска для определенных частей кода, анализируя их результаты по отдельности.

Что такое аннотации

Аннотациями в JUnit называются специальные метки, которые помещаются перед методами в тестовом классе. При их помощи можно точно задавать параметры тестирования, указывая утилите, как нужно их обрабатывать. Полный список аннотаций, включающий в себя подробные инструкции и примеры работы с метками, есть в документации, мы же рассмотрим только самые основные:

  • @Test – ставится перед тестовыми методами, сообщая системе о том, что их нужно исполнять как тестирование, а после завершения провести проверку результата.

  • @Before – применяется для методов, которые необходимо исполнить перед каждым из тестовых случаев. К примеру, если программисту необходимо провести много тестов с одинаковыми стартовыми условиями, ему нужно просто обозначить метод с данной аннотацией и всего один раз задать параметры проверки.

  • @After – применяется с методами, которые следует выполнить после теста.

  • @BeforeClass ― исполняются перед стартом первого теста в классе,

  • @AfterClass ― исполняются после того, как все тесты в данном классе будут завершены.

  • @Ignore ― позволяет исключить исполнение того или иного метода во время тестирования. Метка может пригодиться в случае, если разработчик не хочет использовать определенный тест, но не может исключить его из кода.

Чем JUnit 5 отличается от четвертой версии

На данный момент разработчики используют не только пятую, но и четвертую версию фреймворка. Рассмотрим основные отличия синтаксиса и функционала версий:

  • Четвертая версия фреймворка поддерживает тестирование с использованием метки @RunWith (Parameterized.class, то есть в тест можно передать параметры, которые нужны для проверки). Все тестовые методы в четвертой версии отмечаются при помощи метки @Test. Чтобы выделять методы, которые будут выполняться до или после теста, используются метки @Before и @After.

  • Пятая версия получила поддержку новых модулей: Platform применяется для старта тестов, а Jupiter – для проверки с использованием возможностей Java 8. В этой версии существует возможность писать свои расширения для тестирования и запускать их при помощи метки @ExtendWith. Фреймворк также поддерживает параметризованные тесты с меткой @ParameterizedTest.

Обратите внимание, что в последующих примерах кода будет использоваться JUnit 5, так как он поддерживает и прошлую версию фреймворка, и Java 8.

Как установить фреймворк

Установка пятой версии JUnit занимает совсем немного времени ― вам просто понадобится добавить необходимую зависимость в конфигурационный файл сборщика.

Maven

Для установки на Maven вам будет нужно зайти в pom.xml, отыскать секцию <dependencies> и добавить в нее следующий блок:

<dependency>

 <groupId>org.junit.jupiter</groupId>

 <artifactId>junit-jupiter-api</artifactId>

 <version>5.8.2</version>

 <scope>test</scope>

</dependency>

После чего сохраните изменения. Обратите внимание, что версия фреймворка может отличаться. Актуальные данные можно найти на официальном сайте разработчика.

Gradle

Чтобы установить фреймворк на Gradle, вам понадобится зайти в build.gradle, отыскать секцию dependencies и добавить в нее блок со следующим кодом:

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'

Сохраните изменения. Как и в предыдущем случае, вам понадобится задать версию, при этом желательно использовать самую новую.

Принцип работы JUnit

Чтобы разобраться с тем, как работает данный фреймворк, напишем несложный калькулятор на Java:

public class Calculator {

    public int add(int a, int b) {

        return a + b;

    }

    public int subtract(int a, int b) {

        return a - b;

    }

    public int multiply(int a, int b) {

        return a * b;

    }

    public int divide(int a, int b) {

        if (b == 0) {

            throw new IllegalArgumentException("Cannot divide by zero");

        }

        return a / b;

    }

}

Если мы хотим провести модульное тестирование написанной программы, нам будет нужно создать отдельные тесты для каждого действия (сложения, вычитания и умножения), и два теста для деления. С нашим фреймворком код будет выглядеть следующим образом:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class CalculatorTest {

    @Test

    public void testAddition() {

        Calculator calculator = new Calculator();

        int result = calculator.add(3, 5);

        assertEquals(8, result);

    }

    @Test

    public void testSubtraction() {

        Calculator calculator = new Calculator();

        int result = calculator.subtract(10, 4);

        assertEquals(6, result);

    }

    @Test

    public void testMultiplication() {

        Calculator calculator = new Calculator();

        int result = calculator.multiply(6, 3);

        assertEquals(18, result);

    }

    @Test

    public void testDivision() {

        Calculator calculator = new Calculator();

        int result = calculator.divide(10, 2);

        assertEquals(5, result);

    }

    @Test

    public void testDivisionByZero() {

        Calculator calculator = new Calculator();

        assertThrows(IllegalArgumentException.class, () -> {

            calculator.divide(10, 0);

        });

    }

}

Разберемся подробнее с тем, как работает код:

  • При помощи команды import org.junit.jupiter.api.Test мы импортировали метку Test , которая помечает методы как тестовые случаи, определяя их выполнение при проведении тестирования.

  • Строка import static org.junit.jupiter.api.Assertions.*; нужна для импорта статических методов утверждений (assertions) из класса Assert - assertEquals(expected, actual), которые нужны для сравнения ожидаемого и получившегося результата. Если данные не совпали, значит, тест не был пройден.

  • При помощи строки public class CalculatorTest {… } мы задали класс для тестов.

После этого были прописаны тестовые методы, к примеру testAddition(), testSubtraction(), testMultiplication(), public void testDivision(). Внутри каждого из них проверяется конкретное арифметическое действие. Проверка происходит за счет сравнения выданного программой результата и заранее указанного верного ответа (при помощи assertEquals). Для каждой проверки был создан экземпляр класса Calculator.

Что такое TDD

В прошлом разделе мы сначала создали программу, и только потом – тесты для ее проверки, но существует и еще один подход к тестированию. TDD (Test-driven development) – это методика разработки программного обеспечения, используя которую программист первым делом пишет тесты для будущей функции, а уже после этого ― код для прохождения проверки. TDD удобен тем, что помогает уменьшить время, затрачиваемое на переработку кода и исправление ошибок. Это позволяет сократить ресурсы, которые требуются для разработки и поддержки программного обеспечения.

Рассмотрим упрощенную пошаговую схему работы по данной методике:

  1. Программист пишет тест, который необходим для проверки правильности функционирования будущего кода.

  2. Тест запускается. На этом этапе тестирование не может быть пройдено, так как самого приложения еще не существует.

  3. Программист пишет код утилиты с минимумом функционала, который дает возможность с успехом пройти тестирование.

  4. Тест запускается второй раз. Если все было сделано правильно, тестирование пройдет успешно.

  5. Доработка кода. Чтобы исключить возникновение ошибок, код повторно проверяется после каждого серьезного изменения.

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

Комментарии 0

© ООО "Межрегиональный Информационный центр" Политика конфиденциальности Условия использования Файлы cookie Справка Приложение