Тест cabal не выводит исполняемый файл
У меня есть пакет cabal, для которого я настроил test-suite
с помощью типа exitcode-stdio-1.0
, например:
Когда я запускаю его с помощью cabal test
, cabal не печатает стандартную выходную/стандартную ошибку исполняемого файла; он печатает только собственную информацию о регистрации:
$ cabal test
Running 1 test suites...
Test suite test-foo: RUNNING...
Test suite test-foo: PASS
Test suite logged to: dist/test/foo-0.0.1-test-foo.log
1 of 1 test suites (1 of 1 test cases) passed.
$
Результат, который я хочу, находится в этом файле журнала:
$ cat dist/test/foo-0.0.1-test-fo.log
Test suite test-foo: RUNNING...
HUnit group 1:
Expected connect: [OK]
Test Cases Total
Passed 1 1
Failed 0 0
Total 1 1
Test suite test-foo: PASS
Test suite logged to: dist/test/foo-0.0.1-test-foo.log
$
Как заставить cabal печатать этот вывод на свой собственный стандартный вывод? Я не могу найти его в документации.
Ответы
Ответ 1
Здесь один из способов:
$ cabal test --log=/dev/stdout
Обратите внимание, что это не полное решение, так как Cabal будет буферизовать весь вывод и отображать его только после выхода из тестовой программы.
Последние версии Cabal позволяют передавать потоки:
$ cabal test --show-details=streaming
- шоу-деталь = фильтр
Определяет, отображаются ли результаты отдельных тестовых случаев на Терминал. Может быть всегда (всегда показывать), никогда (никогда не показывать), сбои (показывать только неудачные результаты) или потоковое (показывать все результаты в реальном времени).
Подробнее в Руководство пользователя Cabal.
Ответ 2
В течение нескольких месяцев появился новый способ, и результаты тестов даже записываются в файл stdout в файле, а не краснеют в конце
cabal test --show-details=streaming
Ответ 3
При использовании exitcode-stdio-1.0
cabal сообщит только тестовый журнал, если тестовая программа вернет код выхода (явно "не удается" ). Решение заключалось бы в том, чтобы ваша тестовая программа вернула код ошибки, когда какой-либо из тестов завершился неудачей:
import System.Exit (exitFailure, exitSuccess)
main :: IO ()
main = do
result <- runTests
if result
then exitSuccess
else exitFailure
runTests :: IO Bool
runTests = do
...
return True/False
Вам нужно только это при написании "ручной" программы тестирования: большинство тестовых отчетов (например: tasty, test-framework, hspec) уже делают это автоматически.
Если вы действительно хотите всегда видеть результаты, вы всегда можете использовать либо:
-
cabal test --log=/dev/stdout
(данный в другом ответе)
-
exitFailure
в конце выполнения