Лучшая практика для зацикленного теста JUnit - PullRequest
0 голосов
/ 03 декабря 2018

В школьном задании я должен написать тест черного ящика для метода, который возвращает true для параметра <80 и <code>false в противном случае.В настоящее время мой подход будет

for (int i = 0; i < 80; i++) {
    assertTrue(someMethod(i));
}
for (int i = 80; i <= 100; i++) {
    assertFalse(someMethod(i));
}

Однако для этого потребуется 100 отдельных утверждений.Есть ли лучший / лучший метод практики?Если уместно, я использую JUnit 5, но при необходимости могу переключиться на JUnit 4 (это всего лишь школьное задание).С уважением.

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Чтобы упомянуть другую опцию, которая в этом простом случае выполнит полную проверку: используйте основанное на свойствах тестирование с jqwik на платформе JUnit 5:

import org.junit.jupiter.api.*;

import net.jqwik.api.*;
import net.jqwik.api.constraints.*;

class PartitionedFunctionProperty {

    @Property
    void below80returnTrue(@ForAll @IntRange(min= 0, max = 79) int aNumber) {
        Assertions.assertTrue(someMethod(aNumber));
    }

    @Property
    void from80returnFalse(@ForAll @IntRange(min = 80, max = 100) int aNumber) {
        Assertions.assertFalse(someMethod(aNumber));
    }

    private boolean someMethod(int aNumber) {
        if (aNumber < 80) return true;
        return false;
    }
}

Если вычтобы действительно увидеть, что полный диапазон действительно генерируется, добавьте аннотацию @Report(Reporting.GENERATED) в метод свойства, и вы получите следующий вывод:

timestamp = 2018-12-05T14:50:36.668, generated = [80]
timestamp = 2018-12-05T14:50:36.671, generated = [81]
timestamp = 2018-12-05T14:50:36.672, generated = [82]
timestamp = 2018-12-05T14:50:36.672, generated = [83]
...
timestamp = 2018-12-05T14:50:36.676, generated = [98]
timestamp = 2018-12-05T14:50:36.676, generated = [99]
timestamp = 2018-12-05T14:50:36.677, generated = [100]

timestamp = 2018-12-05T14:50:36.679
    tries = 21
    checks = 21
    generation-mode = EXHAUSTIVE
    after-failure = SAMPLE_ONLY
    seed = 4490524914178941008

Найдите полный рабочий пример на github.

0 голосов
/ 04 декабря 2018

Если кто-то использует JUnit 4:

@RunWith(Parameterized.class)
public class PerformanceStatusTest {

    @Parameterized.Parameters
    public static List<Integer> data() {
        return IntStream.range(0, 100)
                .boxed()
                .collect(Collectors.toList());
    }

    private int testValue;

    public PerformanceStatusTest(final int testValue) {
        this.testValue = testValue;
    }

    @Test
    public void someMethodTest() {
        assertTrue((testValue < 80) == someMethod(testValue));
    }
} 
0 голосов
/ 03 декабря 2018

Для JUnit 5 рассмотрите возможность повторного тестирования:

https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests

Для вашего случая вы можете повторить 100 раз:

@ParameterizedTest
@MethodSource("args")
public void so(int argument)
{
   assertTrue((argument < 80) == someMethod(argument));
}

private static IntStream args()
{
   return IntStream.range(0, 100);
}

Я бы согласился проверить 1- 100 не является абсолютно необходимым, просто проверьте около 80 (79, 80, 81).Единственный другой случай, который может стоил бы, это проверка отрицательного числа, но даже это кажется излишним в этом случае.

Если вы решите просто проверить 79,80,81, тогда ValueSource аннотация чище:

@ParameterizedTest
@ValueSource(ints = { 79, 80, 81 })
public void so(int argument)
{
   assertTrue((argument < 80) == someMethod(argument));
}
0 голосов
/ 03 декабря 2018

Что вы могли бы сделать (в JUnit5):

Напишите (как минимум) три теста, которые охватывают три основных варианта использования, это вход < 80, вход > 80и вход = 80.

Это будет выглядеть так:

@Test
@DisplayName("[< 80]")
@Tag("below_eighty")
void numberBelowEightyTest(TestInfo testInfo) {
    int number = 79;
    assertTrue(someMethod(number));
}

@Test
@DisplayName("[= 80]")
@Tag("equals_eighty")
void numberEqualsEightyTest(TestInfo testInfo) {
    int number = 80;
    assertFalse(someMethod(number));
}

@Test
@DisplayName("[> 80]")
@Tag("above_eighty")
void numberAboveEightyTest(TestInfo testInfo) {
    int number = 81;
    assertFalse(someMethod(number));
}

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

0 голосов
/ 03 декабря 2018

Обычно вам будет достаточно просто протестировать граничные случаи и, возможно, один дополнительный представитель одного из диапазонов, например,

assertTrue(someMethod(79));
assertFalse(someMethod(80));

// not reaaaally necessary
assertTrue(someMethod(50));
assertFalse(someMethod(100));

В вашем случае вы также можете добавить отсечение какконстанта (например, static final int THRESHOLD = 80) и использовать ее в ваших тестовых случаях;таким образом легче изменить, если порог изменяется.

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