У меня есть класс Java. Как мне юнит-тест это?
В моем случае у меня класс делает двоичную сумму. Он берет два массива byte[]
, суммирует их и возвращает новый двоичный массив.
У меня есть класс Java. Как мне юнит-тест это?
В моем случае у меня класс делает двоичную сумму. Он берет два массива byte[]
, суммирует их и возвращает новый двоичный массив.
Определите ожидаемый и желаемый выход для нормального случая с правильным вводом.
Теперь выполните тест, объявив класс, назовите его как угодно (обычно что-то вроде TestAddingModule) и добавьте к нему метод testAdd (т.е. тот, что приведен ниже):
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));
}
Для создания модульного теста для вашего проекта, пожалуйста, выполните следующие действия (я использую Eclipse для написания этого теста):
1- Нажмите New → Java Project.
2- Запишите название своего проекта и нажмите "Готово".
3- Щелкните правой кнопкой мыши по вашему проекту. Затем нажмите New → Class.
4- Запишите свое имя класса и нажмите "Готово".
Затем завершите класс следующим образом:
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.
6- Проверьте setUp() и нажмите "Готово". SetUp() будет местом, где вы инициализируете свой тест.
7- Нажмите на ОК.
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.
10- Это результат теста.
Я надеюсь, что это помогает.
Это очень общий вопрос, и есть много способов, на которые можно ответить.
Если вы хотите использовать 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 вместо того, чтобы делать это вручную. Таким образом, вы можете повторно запустить тест намного проще, чем если бы вам пришлось выполнять ручные тесты.
Как упоминается @CoolBeans, посмотрите jUnit. Вот короткая tutorial, чтобы начать работу с jUnit 4.x
Наконец, если вы действительно хотите узнать больше о тестировании и разработке тестов (TDD), я рекомендую вам взглянуть на следующую книгу Кента Бек: Разработка, основанная на тестах, по примеру.
Другие ответы показали, как использовать JUnit для настройки тестовых классов. JUnit - не единственная среда тестирования Java. Сосредоточение внимания на технических деталях использования фреймворка, однако, отвлекает от наиболее важных концепций, которыми должны руководствоваться ваши действия, поэтому я буду говорить о них.
Тестирование (всевозможных вещей) сравнивает фактическое поведение чего-либо (тестируемая система, SUT) с ожидаемым поведением.
Автоматизированное тестирование может быть выполнено с использованием компьютерной программы. Поскольку это сравнение выполняется негибкой и неразумной компьютерной программой, ожидаемое поведение должно быть точно и однозначно известно.
То, что программа или часть программы (класс или метод) должны делать, это их спецификация. Поэтому для тестирования программного обеспечения требуется наличие спецификации для SUT. Это может быть явное описание или неявная спецификация того, что ожидается.
Поэтому автоматическое модульное тестирование требует точной и однозначной спецификации класса или метода, который вы тестируете.
Но вам нужна была эта спецификация, когда вы решили написать этот код. Таким образом, часть того, о чем идет речь, фактически начинается, прежде чем вы напишете хотя бы одну строку SUT. Техника тестирования Test Driven Development (TDD) доводит эту идею до крайности и заставляет вас создавать код модульного тестирования, прежде чем писать код для тестирования.
Фреймворки модульного тестирования проверяют ваше SUT с использованием утверждений. Утверждение - это логическое выражение (выражение с типом результата boolean
; предикат), которое должно быть true
, если SUT ведет себя правильно. Поэтому спецификация должна быть выражена (или повторно выражена) как утверждения.
Полезной техникой для выражения спецификации в качестве утверждений является программирование по контракту. Эти спецификации в терминах постусловий. Постусловие - это утверждение о публично видимом состоянии SUT после возврата из метода или конструктора. Некоторые методы имеют постусловия
это инварианты, которые являются предикатами, истинными до и после выполнения метода. Можно также сказать, что класс имеет инварианты, которые являются постусловиями каждого конструктора и метода класса и, следовательно, всегда должны быть истинными. Постусловия (и инварианты) выражаются только с точки зрения видимого состояния публичности: полей public
и protected
, значений, возвращаемых методами, возвращенными методами public
и protected
(например, геттерами), и публично видимого состояния объекты, переданные (по ссылке) методам.
Многие начинающие публикуют здесь вопросы, спрашивая, как они могут протестировать некоторый код, представляя код, но без указания спецификации для этого кода. Как показывает это обсуждение, никто не может дать хороший ответ на такой вопрос, потому что в лучшем случае потенциальные ответчики должны угадать спецификацию и могут сделать это неправильно. Тот, кто задает вопрос, очевидно, не понимает важности спецификации и, следовательно, является новичком, который должен понять основы, которые я описал здесь, прежде чем пытаться написать некоторый тестовый код.
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");
}
}