Как сообщить о неудачных тестах

Я использую Haskell Test Framework через Stack для оценки свойств QuickCheck. Когда я запускаю stack test, о неисправных свойствах сообщается в виде Gave up! Passed only 95 tests. Многие примеры тестирования свойств, которые я нашел, сообщают об ошибках в форме Falsifiable, after 48 tests, за которыми следуют неудавшиеся аргументы. Однако эти примеры, похоже, запускают QuickCheck напрямую, а не через стек и HTF.

Как я могу настроить свою среду, чтобы сообщать об аргументах, созданных QuickCheck, которые не удовлетворяют тестируемому свойству? Как указано в разделе Тестирование с помощью HTF, документация уже скудна и скудна только для некоторых из этих инструментов, пусть только для объединения их вместе.


person CAPSLOCK    schedule 11.04.2017    source источник


Ответы (2)


"Сдаться!" означает другой тип отказа, чем «фальсифицируемый».

В QuickCheck есть способ отбрасывать тестовые примеры, которые вы считаете «неправильными», не засчитывая ни фактического успеха, ни провала. Типичным источником таких отбрасываний является использование оператора импликации (==>), где тестовые случаи, которые не удовлетворяют предварительному условию, отбрасываются: «успех» засчитывается только тогда, когда выполняется предварительное условие, чтобы дать вам лучшее представление о том, в какой степени вы проверяете постусловие справа (что, вероятно, является той частью, которая действительно важна для вас как пользователя). Также возможно явное использование свойства discard, значение которого отличается от фактического сбоя, например возврата False.

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

  • использовать лучший генератор (избегая сброса);
  • поднять порог сброса, @stefanwehr показывает, как это сделать в HTF, в другом ответе;
  • эти выбросы на самом деле должны быть неудачами.
person Li-yao Xia    schedule 11.04.2017
comment
Как и следовало ожидать, настоящей проблемой был мой набор предположений. Спасибо. - person CAPSLOCK; 12.04.2017
comment
Я честно изо всех сил пытаюсь найти какую-либо информацию о том, как указать параметры для HTF. Это предназначено для передачи через командную строку? Есть ли программный вариант? Я не могу найти полную документацию по этим инструментам, и это очень расстраивает. - person CAPSLOCK; 14.04.2017
comment
Извините, я перепутал HTF, о котором вы спрашивали, с тестовой структурой, о которой я в итоге говорил. У @stefanwehr есть ответ о том, как установить этот конкретный параметр. Кажется, нет встроенного способа указать его из командной строки. - person Li-yao Xia; 14.04.2017

@ Ли-яо Ся прав, говоря, что ваш генератор генерирует множество тестовых случаев, которые можно отбросить. Чтобы повысить порог отбрасывания с помощью HTF, вы должны написать свое свойство следующим образом:

prop_somePropertyWithRaisedDiscardThreshold =
    withQCArgs (\args -> args { maxDiscardRatioy = 1000 })
    somePredicateOrProperty

Переменная args имеет тип Args непосредственно из пакета quickcheck.

person stefanwehr    schedule 11.04.2017