Как написать Unit Test?

У меня есть класс Java. Как мне юнит-тест это?


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

Ответ 1

  • Определите ожидаемый и желаемый выход для нормального случая с правильным вводом.

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

    • Напишите метод, а над ним добавьте аннотацию @Test.
    • В методе запустите двоичную сумму и assertEquals(expectedVal,calculatedVal).
    • Протестируйте свой метод, запустив его (в Eclipse щелкните правой кнопкой мыши, выберите "Выполнить как → Тест JUnit" ).

      //for normal addition 
      @Test
      public void testAdd1Plus1() 
      {
          int x  = 1 ; int y = 1;
          assertEquals(2, myClass.add(x,y));
      }
      
  • Добавьте другие случаи по желанию.

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

      //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));
      }
      

Ответ 2

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

1- Нажмите New → Java Project.

Create Project

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

Create Project

3- Щелкните правой кнопкой мыши по вашему проекту. Затем нажмите New → Class.

Create Class

4- Запишите свое имя класса и нажмите "Готово".

Create Class

Затем завершите класс следующим образом:

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

5- Нажмите Файл → Создать → Тестовый пример JUnit.

Create JUnite Test

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

Check SetUp()

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

Add 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- Напишите, нажмите на свой тестовый класс в проводнике пакетов и нажмите Run as → JUnit Test.

Run JUnit Test

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

Result of The Test

Я надеюсь, что это помогает.

Ответ 3

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

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

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

  • Простое добавление между двумя положительными числами. Добавьте их, затем проверьте, что результат будет тем, что вы ожидаете.
  • Добавление между положительным и отрицательным числом (которое возвращает результат со знаком первого аргумента).
  • Добавление между положительным и отрицательным числом (которое возвращает результат со знаком второго аргумента).
  • Добавление двух отрицательных чисел.
  • Добавление, которое приводит к переполнению.

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

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

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() { ... }
}

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

Ответ 4

Как упоминается @CoolBeans, посмотрите jUnit. Вот короткая tutorial, чтобы начать работу с jUnit 4.x

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

Ответ 5

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

  • Тестирование (всевозможных вещей) сравнивает фактическое поведение чего-либо (тестируемая система, SUT) с ожидаемым поведением.

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

  • То, что программа или часть программы (класс или метод) должны делать, это их спецификация. Поэтому для тестирования программного обеспечения требуется наличие спецификации для SUT. Это может быть явное описание или неявная спецификация того, что ожидается.

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

  • Но вам нужна была эта спецификация, когда вы решили написать этот код. Таким образом, часть того, о чем идет речь, фактически начинается, прежде чем вы напишете хотя бы одну строку SUT. Техника тестирования Test Driven Development (TDD) доводит эту идею до крайности и заставляет вас создавать код модульного тестирования, прежде чем писать код для тестирования.

  • Фреймворки модульного тестирования проверяют ваше SUT с использованием утверждений. Утверждение - это логическое выражение (выражение с типом результата boolean; предикат), которое должно быть true, если SUT ведет себя правильно. Поэтому спецификация должна быть выражена (или повторно выражена) как утверждения.

  • Полезной техникой для выражения спецификации в качестве утверждений является программирование по контракту. Эти спецификации в терминах постусловий. Постусловие - это утверждение о публично видимом состоянии SUT после возврата из метода или конструктора. Некоторые методы имеют постусловия это инварианты, которые являются предикатами, истинными до и после выполнения метода. Можно также сказать, что класс имеет инварианты, которые являются постусловиями каждого конструктора и метода класса и, следовательно, всегда должны быть истинными. Постусловия (и инварианты) выражаются только с точки зрения видимого состояния публичности: полей public и protected, значений, возвращаемых методами, возвращенными методами public и protected (например, геттерами), и публично видимого состояния объекты, переданные (по ссылке) методам.


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

Ответ 6

public class FirtJunit {

    @BeforeClass
    public static void startUp() {
        System.out.println("BeforeClass");
    }
    @AfterClass
    public static void shutDown() {
        System.out.println("AfterClass");
    }
    @Before
    public void setup() {
        System.out.println("Before");
    }
    @After
    public void tearDown() {
        System.out.println("After");
    }
    @Test
    public void mul() {
        System.out.println("Test for mul");
    }
    @Test
    public void div() {
        System.out.println("Test for div");
    }




}