Как написать модульный тест? - PullRequest
124 голосов
/ 06 января 2012

У меня есть класс Java.Как я могу модульный тест это?


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

Ответы [ 5 ]

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

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

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

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

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

      //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));
      }
      
81 голосов
/ 08 января 2017

Для создания модульного теста для вашего проекта, пожалуйста, выполните следующие действия (я использую 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 Test Case.

Create JUnite Test

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

Check SetUp()

7- Нажмите OK.

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

Надеюсь, это поможет.

16 голосов
/ 06 января 2012

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

Если вы хотите использовать JUnit для создания тестов, вам нужно создать свой класс 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 вместо того, чтобы делать это вручную.Таким образом, вы можете гораздо проще повторить тест, чем если бы вам приходилось выполнять ручные тесты.

7 голосов
/ 06 января 2012

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

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

1 голос
/ 13 декабря 2018

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...