Вопрос-ответ

How to write a Unit Test?

Как написать модульный тест?

У меня есть класс Java. Как я могу его модульно протестировать?


В моем случае у меня есть класс, который выполняет двоичную сумму. Он принимает два byte[] массива, суммирует их и возвращает новый двоичный массив.

Переведено автоматически
Ответ 1

Я предоставляю этот пост как для IntelliJ, так и для Eclipse.

Eclipse:

Чтобы создать модульный тест для вашего проекта, пожалуйста, выполните следующие действия (я использую Eclipse для написания этого теста):

1- Щелкните Создать -> Java Project.

Создать проект

2- Запишите название вашего проекта и нажмите "Готово".

Создать проект

3- Щелкните правой кнопкой мыши на вашем проекте. Затем нажмите Создать -> Класс.

Создать класс

4- Write down your class name and click on finish.

Create Class

Then, complete the class like this:

public class Math {
int a, b;
Math(int a, int b) {
this.a = a;
this.b = b;
}
public int add() {
return a + b;
}
}

5- Click on File -> New -> JUnit Test Case.

Создать JUnite-тест

6- Проверьте setUp() и нажмите "Готово". SetUp () будет местом, где вы инициализируете свой тест.

Проверьте SetUp()

7- Нажмите "ОК".

Добавить JUnit

8- Здесь я просто добавляю 7 и 10. Итак, я ожидаю, что ответом будет 17. Завершите свой тестовый класс следующим образом:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class MathTest {
Math math;
@Before
public void setUp() throws Exception {
math = new Math(7, 10);
}
@Test
public void testAdd() {
Assert.assertEquals(17, math.add());
}
}

9- Запись щелкните по вашему тестовому классу в проводнике пакетов и нажмите "Выполнить как" -> JUnit Test.

Запустите JUnit-тест

10 - Это результат теста.

Результат теста

IntelliJ: Обратите внимание, что для скриншотов я использовал IntelliJ IDEA community 2020.1. Кроме того, перед выполнением этих шагов вам необходимо настроить jre. Я использую JDK 11.0.4.

1- Щелкните правой кнопкой мыши по основной папке вашего проекта-> создать -> каталог. Вы должны назвать это "тест". введите описание изображения здесь 2- Щелкните правой кнопкой мыши по папке с тестом и создайте соответствующий пакет. Я предлагаю создать те же имена пакетов, что и у исходного класса. Затем вы щелкаете правой кнопкой мыши по каталогу тестов -> отмечаете каталог как -> корень тестовых источников. введите описание изображения здесь 3- В нужном пакете в каталоге test вам нужно создать класс Java (я предлагаю использовать Test.java). введите описание изображения здесь 4- В созданном классе введите '@Test'. Затем среди опций, которые предоставляет IntelliJ, выберите Добавить 'JUnitx' в classpath. введите описание изображения здесь
введите описание изображения здесь 5- Напишите свой тестовый метод в своем тестовом классе. Сигнатура метода выглядит так:

@Test
public void test<name of original method>(){
...
}

Вы можете выполнить свои утверждения, как показано ниже:

Assertions.assertTrue(f.flipEquiv(node1_1, node2_1));

Это импорт, который я добавил:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

введите описание изображения здесь

Это тест, который я написал:
введите описание изображения здесь

Вы можете проверить свои методы, как показано ниже:

Assertions.assertEquals(<Expected>,<actual>);
Assertions.assertTrue(<actual>);
...

Чтобы запустить модульные тесты, щелкните правой кнопкой мыши на тесте и нажмите "Выполнить" .
введите описание изображения здесь

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

Ответ 2

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


  2. Теперь реализуйте тест, объявив класс, назовите его как угодно (обычно что-то вроде TestAddingModule) и добавьте к нему метод testAdd (например, как показано ниже) :



    • Напишите метод, а над ним добавьте аннотацию @Test .

    • В методе запустите двоичную сумму и assertEquals(expectedVal,calculatedVal).

    • Протестируйте свой метод, запустив его (в Eclipse щелкните правой кнопкой мыши и выберите Запустить как → JUnit test).


      //for normal addition 
      @Test
      public void testAdd1Plus1()
      {
      int x = 1 ; int y = 1;
      assertEquals(2, myClass.add(x,y));
      }


  3. Добавляйте другие варианты по желанию.



    • Проверьте, что ваша двоичная сумма не выдает неожиданного исключения при переполнении целого числа.

    • Проверьте, что ваш метод корректно обрабатывает входные данные Null (пример ниже).


      //if you are using 0 as default for null, make sure your class works in that case.
      @Test
      public void testAdd1Plus1()
      {
      int y = 1;
      assertEquals(0, myClass.add(null,y));
      }


Ответ 3

Это очень общий вопрос, и на него можно ответить множеством способов.

Если вы хотите использовать JUnit для создания тестов, вам нужно создать свой класс testcase, затем создать отдельные методы тестирования, которые тестируют конкретную функциональность вашего класса / модуля в рамках тестов (отдельные классы testcase обычно связаны с одним "производственным" классом, который тестируется), и внутри этих методов выполнять различные операции и сравнивать результаты с тем, что было бы правильным. Особенно важно постараться охватить как можно больше угловых примеров.

В вашем конкретном примере вы могли бы, например, протестировать следующее:


  1. Простое сложение двух положительных чисел. Добавьте их, затем убедитесь, что результат соответствует вашим ожиданиям.

  2. Сложение между положительным и отрицательным числом (которое возвращает результат со знаком первого аргумента).

  3. Сложение между положительным и отрицательным числом (которое возвращает результат со знаком второго аргумента).

  4. Сложение между двумя отрицательными числами.

  5. Дополнение, которое приводит к переполнению.

Для проверки результатов вы можете использовать различные методы assertXXX из класса org.junit.Assert (для удобства вы можете выполнить 'import static org.junit.Assert.*'). Эти методы проверяют определенное условие и завершают тест неудачно, если оно не подтверждается (необязательно с определенным сообщением).

Пример класса testcase в вашем случае (без определенного содержимого методов):

import static org.junit.Assert.*;

public class AdditionTests {
@Test
public void testSimpleAddition() { ... }


@Test
public void testPositiveNegativeAddition() { ... }


@Test
public void testNegativePositiveAddition() { ... }


@Test
public void testNegativeAddition() { ... }


@Test
public void testOverflow() { ... }
}

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

Ответ 4

Как упоминалось в @CoolBeans, взгляните на JUnit. Вот краткое руководство, которое также поможет вам начать работу с JUnit 4.x

Наконец, если вы действительно хотите узнать больше о тестировании и разработке на основе тестирования (TDD), я рекомендую вам ознакомиться со следующей книгой Кента Бека: Разработка на основе тестирования на примере.

java unit-testing