Хорошо, поэтому у меня есть лист проблем с курсовой работой, который я только что закончил, я знаю, что он работает нормально, но я хотел написать несколько тестов jUnit для него, как и для некоторой практики тестирования. Это вызвало ряд вопросов. Я написал функцию под названием count
которая принимает int n
и суммирует все значения от 1 to n
и возвращает их. Итак, я написал 4 тестовых примера для этого и предположил, что все они должны идти в рамках одного и того же метода тестирования:
@Test
public void testCount() {
assertEquals(0, SimmonsPS5.count(0)); // 1 obj in table with name => 0 permutations
assertEquals(1, SimmonsPS5.count(1)); // 2 obj in table with name => 1 permutation
assertEquals(3, SimmonsPS5.count(2)); // 2 obj in table with name => 3 permutations (3c2)
assertEquals(5050, SimmonsPS5.count(100)); // 100 obj in table with name => 100c2 permutations (100(100+1)/2)
}
Но тогда, если кто-то пропустит тест (который, вероятно, будет означать, что все это делают), корреспондент ошибки скажет только, что один тест не прошел, что неверно.
Затем мой основной метод в классе создает экземпляр класса, выполняет несколько функций, а затем печатает на stdout
. Основной метод делает это, сначала беря в один параметр (имя файла), а затем читает файл и выполняет некоторые операции над ним. Поэтому я хочу проверить, что он выводит правильные данные для каждого файла - должен ли каждый из этих тестовых случаев находиться в одном и том же методе тестирования или отдельных? Я выбрал отдельные, но только по той единственной причине, что мне кажется, что они более склонны к неудаче, чем предыдущий метод. Итак, если это правильный способ протестировать его, какой метод следует вызывать? testMain1
, testMain2
т.д.? Что такое "принятая" номенклатура?
Мой main
тестовый пример:
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
@Before
public void setUpStreams() {
System.setOut(new PrintStream(outContent));
System.setErr(new PrintStream(errContent));
}
@After
public void cleanUpStreams() {
System.setOut(null);
System.setErr(null);
}
@Test
public void testMain4in() {
SimmonsPS5.main(new String[]{"4.in"});
assertEquals(47485, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain5in() {
SimmonsPS5.main(new String[]{"5.in"});
assertEquals(1667, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain6in() {
SimmonsPS5.main(new String[]{"6.in"});
assertEquals(45871, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain7in() {
SimmonsPS5.main(new String[]{"7.in"});
assertEquals(324, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain8in() {
SimmonsPS5.main(new String[]{"8.in"});
assertEquals(1057527, Integer.parseInt(outContent.toString().trim()));
}
Обратите внимание, что вывод в stdout
представляет собой единое целое число.
Вы хотите, чтобы каждый тест тестировал определенную функцию. Все проведенные тесты должны коллективно указывать, работает ли функция правильно или нет. Так, например, в первом примере:
@Test
public void testCount() {
assertEquals(0, SimmonsPS5.count(0)); // 1 obj in table with name => 0 permutations
assertEquals(1, SimmonsPS5.count(1)); // 2 obj in table with name => 1 permutation
assertEquals(3, SimmonsPS5.count(2)); // 2 obj in table with name => 3 permutations (3c2)
assertEquals(5050, SimmonsPS5.count(100)); // 100 obj in table with name => 100c2 permutations (100(100+1)/2)
}
Это было бы уместно. Вы проверяете, работает ли count()
в соответствии с проектом. Если какой-либо из них не работает, то count()
не ведет себя так, как было запланировано.
Неважно, сколько из этих тестов терпит неудачу - действие, которое вы предпринимаете, если все они терпят неудачу, будет таким же, как и действие, которое вы предпринимаете, если один из них не работает: count()
отладок count()
.
Ваш второй случай:
Основной метод делает это, сначала беря в один параметр (имя файла), а затем читает файл и выполняет некоторые операции над ним. Поэтому я хочу проверить, что он выводит правильные данные для каждого файла - должен ли каждый из этих тестовых случаев находиться в одном и том же методе тестирования или отдельных?
Независимо от того, сочетаете ли вы их в одном тесте, зависит, концептуально, что вы тестируете. Вы проверяете, работает ли main()
? Или вы проверяете, работает ли он на одном конкретном файле? Первый был бы более концептуально правильным тестом, так как вы на самом деле не заботитесь о том, чтобы он работал с вашими конкретными файлами, вам все равно, что он работает так же, как и для любых файлов, и вы придумываете набор тестовых файлов, которые вы считаете точно отображает типы файлов, на которых будет работать программа.