Должны ли похожие тестовые случаи jUnit находиться в одном тесте?

1

Хорошо, поэтому у меня есть лист проблем с курсовой работой, который я только что закончил, я знаю, что он работает нормально, но я хотел написать несколько тестов 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 представляет собой единое целое число.

Теги:
unit-testing
junit

1 ответ

2
Лучший ответ

Вы хотите, чтобы каждый тест тестировал определенную функцию. Все проведенные тесты должны коллективно указывать, работает ли функция правильно или нет. Так, например, в первом примере:

@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()? Или вы проверяете, работает ли он на одном конкретном файле? Первый был бы более концептуально правильным тестом, так как вы на самом деле не заботитесь о том, чтобы он работал с вашими конкретными файлами, вам все равно, что он работает так же, как и для любых файлов, и вы придумываете набор тестовых файлов, которые вы считаете точно отображает типы файлов, на которых будет работать программа.

  • 1
    Я не могу поверить, что мы согласны с этим;)
  • 0
    @NiklasB. Это дважды за один день!
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню