Тест 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 в конце выполнения