Jqwik: Как проверить, покрыты ли все возможности?

Как проверить, покрываются ли в сумме все возможности (декартово произведение аргументов) N свойствами? Некоторые из них можно тестировать несколько раз по разным свойствам.

2 ответа

В jqwik нет способа установить исчерпывающую генерацию параметров для методов свойств. Однако вы можете проверить все условия свойства в одном методе свойства:

      @Property(generation = GenerationMode.EXHAUSTIVE)
void fullCartesianProductProperty(
    @ForAll @IntRange(min = 0, max = 1) int p1,
    @ForAll @IntRange(min = 0, max = 3) int p2,
    @ForAll @IntRange(min = 1, max = 3) int p3
) {
    MyEnum result = toCheck(p1, p2, p3);
    if (p1 > 0) {
        // Will only be executed in 12 cases
        assertThat(result)...;
    }
    if (p2 <= 2) {
        // Will only be executed in 18 cases
        assertThat(result)...;
    }
    if (p3 > 1) {
        // Will only be executed in 16 cases
        assertThat(result)...;
    }
    // Will be executed in all 24 cases
    assertThat(result);
}

В этом случае будут исполнены все 24 комбинации.

Имейте в виду, что необходим только в том случае, если размер декартова произведения превышает количество попыток свойства (по умолчанию 1000).

Я нашел решение с помощью AfterContainer, но у меня проблема с исчезновением статистики после каждого свойства.

      private static final StatisticsCollectorImpl CLASS_STATISTICS_COLLECTOR = new StatisticsCollectorImpl("allCases");

На самом деле я использую созданный вручную StatisticsCollectorImpl и дополнительно обновляю его в каждом свойстве. Итак, в результате у меня есть статистика по свойствам и по классам.

      Statistics.collect(p1, p2, p3);
CLASS_STATISTICS_COLLECTOR.collect(p1, p2, p3);

Поддельное свойство allCasesGenerator генерирует декартово произведение.

      @Property(generation = GenerationMode.EXHAUSTIVE)
void allCasesGenerator (
    @ForAll @IntRange(min = 0, max = 1) int p1,
    @ForAll @IntRange(min = 0, max = 3) int p2,
    @ForAll @IntRange(min = 1, max = 3) int p3
) {
    CLASS_STATISTICS_COLLECTOR.collect(p1, p2, p3);
}

В AfterContainer я проверяю кейсы, существующие только один раз - только из allCasesGenerator.

      @AfterContainer
    static void afterAll() {
        final List<String> presentOnlyInAllCasesGeneratorProperty = CLASS_STATISTICS_COLLECTOR.statisticsEntries()
                .stream()
                .filter(entry -> entry.count() <= 1)
                .map(StatisticsEntryImpl::name)
                .collect(Collectors.toList());
        assertThat(presentOnlyInAllCasesGeneratorProperty)
                .isEmpty();
    }
Другие вопросы по тегам