2015-10-02 11 views
8

Если я test/Test.hs сПочему мой тестовый пакет HUnit проходит, когда мои тесты терпят неудачу?

module Main where 

import Test.HUnit 

test1 :: Test 
test1 = TestCase $ assertEqual "Should be one" 1 5 

test2 :: Test 
test2 = TestCase $ assertEqual "Shold both be zero" 0 0 

main :: IO Counts 
main = runTestTT $ TestList [test1, test2, test1] 

и .cabal с

test-suite my-test 
    type:    exitcode-stdio-1.0 
    hs-source-dirs:  test 
    main-is:   Test.hs 
    build-depends:  base >= 4.8.1.0 && <4.9, 
         HUnit >= 1.3 
    default-language: Haskell2010 

и я бегу cabal test --show-details='always' тогда я получаю

Test suite my-test: RUNNING... 
### Failure in: 0 
test/Test.hs:6 
Should be one 
expected: 1 
but got: 5 
### Failure in: 2 
test/Test.hs:6 
Should be one 
expected: 1 
but got: 5 
Cases: 3 Tried: 3 Errors: 0 Failures: 2 
Test suite my-test: PASS 

Почему мой тестовый проход ванной, когда я был неудачи? Аналогично, если я cabal sdist, я не получаю предупреждения о том, что мои тесты потерпели неудачу.

ответ

4

Согласно Cabal users' guide,

Наборы тестов с использованием интерфейса exitcode-stdio-1.0 исполняемые, которые указывают на сбой теста с кодом ненулевым при запуске; они могут предоставлять доступную для человека информацию журнала через стандартные каналы вывода и ошибки.

Вы определили

main :: IO Counts 
main = runTestTT $ TestList [test1, test2, test1] 

Это запускает тесты, выводит информацию тест, а затем всегда завершается успешно. Если вы хотите, чтобы Cabal узнал, что тест не сработал, вам необходимо зафиксировать Counts, проверить на errors и failures и выйти с ненулевым статусом, если вы найдете его.

main :: IO() 
main = do 
    results <- runTestTT $ TestList [test1, test2, test1] 
    if (errors results + failures results == 0) 
    then 
     exitWith ExitSuccess 
    else 
     exitWith (ExitFailure 1) 

Пакет test-framework предоставляет удобные defaultMain функции, которые делают такие вещи; вы можете рассмотреть этот подход.

Следует напомнить, что интерфейс exitcode-stdio-1.0 считается недостоверным; разработчики Cabal рекомендуют переключиться на их довольно больший интерфейс Haskellian detailed-0.9.

+0

Я изучил 'подробный-0.9', но [получил vibe] (http://stackoverflow.com/a/18686329/656912), что он был менее стабильным и сложным в использовании. – orome

+0

@raxacoricofallapatorius, может быть. Я никогда не сталкивался с этим; Я только немного поработал над существующими наборами тестов в существующих проектах. – dfeuer

+0

@dfeuer: Я использовал ваш подход с 'ExitSuccess' и' ExitFailure', но по какой-то причине он не работает, если я запускаю 'cabal test -show-details = 'always'' - build говорит тестовый набор: PASS, хотя есть одна неудача. Не могли бы вы посоветовать обходное решение? – altern

 Смежные вопросы

  • Нет связанных вопросов^_^