Каков «правильный» способ проверить вывод методов Java? - PullRequest
5 голосов
/ 19 марта 2009

В Python у меня часто бывают тесты, которые выглядят примерно так:

tests = [
    (2, 4),
    (3, 9),
    (10, 100),
]
for (input, expected_output) in tests:
    assert f(input) == expected_output

Каков «правильный» способ написания таких тестов (где указан набор тестов, затем каждый из них запускается циклом) в Java с JUnit?

Спасибо!

Упреждающий ответ : я понимаю, что я мог бы сделать что-то вроде:

assertEquals(4, f(2))
assertEquals(9, f(3))
....

Но ... я надеюсь, что есть лучший способ.

Ответы [ 7 ]

11 голосов
/ 19 марта 2009

То же самое.

    int[][] tests = {
            {2, 4},
            {3, 9},
            {10, 100}
    };
    for (int[] test : tests) {
        assertEquals(test[1], f(test[0]));
    }

Конечно, не так хорош, как питон, но мало что есть.

Вы также можете посмотреть Теории JUnit , будущую функцию ...

5 голосов
/ 19 марта 2009

Правильный путь - писать отдельные утверждения assert, даже если вам это не нравится.

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

Однако, если вы генерируете свои тестовые данные автоматически, это другая история.

3 голосов
/ 19 марта 2009

Посмотрите на параметризованный тестовый запуск в Junit.

http://junit.org/apidocs/org/junit/runners/Parameterized.html

Похоже, он будет делать именно то, что вы ищете.

1 голос
/ 19 марта 2009

Гм ...

int[][] tests = new int[][]{
        {2, 4},
        {3, 9},
        {10, 100},
    };

for(int[] i : tests)
{
    assertEquals(i[1], f(i[0]);
}

То же самое, правда. Единственной проблемой является отсутствие в Java литерала кортежа, поэтому для более сложных случаев вам придется использовать массивы Object [] и приведение типов или писать класс Tuple.

0 голосов
/ 19 марта 2009

Определенно не эксперт по модульному тестированию, но я бы предпочел иметь отдельный метод для каждого случая, с которым я тестирую, и использовать некоторые инструменты для запуска тестирования (например, NUnit-GUI, для C #). Таким образом, я бы точно знал, в каком случае произойдет сбой, если это произойдет. Это больше работы, но я думаю, что в конечном итоге это хорошо окупается.

0 голосов
/ 19 марта 2009

В Java нет кортежей, но вы можете использовать Map или два параллельных массива для указания пар ввода / вывода, а затем выполнить цикл, как в примере с Python.

0 голосов
/ 19 марта 2009

Не могли бы вы просто определить простой класс с двумя полями, реальным результатом и ожидаемым результатом, а затем перебрать коллекцию аналогично тому, что делает ваш фрагмент Python?

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