2015-10-02 25 views
8

Se ho test/Test.hs conPerché la mia suite di test HUnit passa quando i miei test falliscono?

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] 

e un .cabal con

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 

e corro cabal test --show-details='always' allora ottengo

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 

Perché il mio test di passaggio suite quando ho avuto fallimenti? Allo stesso modo, se I cabal sdist non viene visualizzato alcun avviso che i miei test non sono riusciti.

risposta

4

Secondo la Cabal users' guide,

suite di test utilizzando l'interfaccia exitcode-stdio-1.0 sono eseguibili che indicano fallimento del test con un codice di uscita diverso da zero quando eseguito; possono fornire informazioni di registro leggibili dall'uomo attraverso i canali di output e di errore standard.

Hai definito

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

Questo test viene eseguito, stampa le informazioni di test, e poi esce sempre con successo. Se vuoi che Cabal sappia che il test è fallito, devi acquisire lo Counts, controllare errors e failures, e uscire con uno stato diverso da zero se lo trovi.

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

Il pacchetto test-framework offre comode defaultMain funzioni che fanno questo genere di cose; potresti voler considerare questo approccio.

Si noti che l'interfaccia exitcode-stdio-1.0 è considerata semi-deprecata; i manutentori della Cabala consigliano di passare alla loro interfaccia piuttosto più Haskellian detailed-0.9.

+0

Avevo esaminato 'dettagliato-0.9', ma [ho ottenuto l'atmosfera] (http://stackoverflow.com/a/18686329/656912) che era meno stabile e difficile da usare. – orome

+0

@raxacoricofallapatorius, potrebbe essere. Non ho mai avuto problemi con entrambi; Ho solo fatto un po 'di espansione delle suite di test esistenti in progetti esistenti. – dfeuer

+0

@dfeuer: Ho usato il tuo approccio con 'ExitSuccess' e' ExitFailure', ma non funziona per qualche motivo se eseguo 'test della cabala --show-details = 'always'' - build dice test suite: PASS anche se c'è un fallimento. Potresti raccomandare una soluzione alternativa? – altern

Problemi correlati