2015-10-02 6 views
8

Wenn ich test/Test.hs mitWarum passiert meine Hunit Testsuite, wenn meine Tests fehlschlagen?

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] 

und ein .cabal mit

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 

und ich laufe cabal test --show-details='always' dann bekomme ich

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 

Warum kommt der Test-Suite weiter, wenn ich je hatte Fehler? Ebenso, wenn ich cabal sdist bekomme ich keine Warnung, dass meine Tests fehlgeschlagen sind.

Antwort

4

Nach den Cabal users' guide,

Test-Suiten der exitcode-stdio-1.0 Schnittstelle sind ausführbare Dateien, die Testfehler mit einem Nicht-Null-Exit-Code angeben, wann laufen; Sie können durch die Standard-Ausgabe- und -Fehlerkanäle für Menschen lesbare Protokollinformationen bereitstellen.

Sie haben

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

Dies führt Tests, druckt Testinformationen und tritt dann immer erfolgreich. Wenn Sie möchten, dass Cabal weiß, dass der Test fehlgeschlagen ist, müssen Sie die Counts erfassen, nach errors und failures suchen und den Status mit einem Status ungleich Null beenden, wenn Sie einen solchen finden.

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

Das test-framework Paket bietet komfortable defaultMain Funktionen, die diese Art der Sache zu tun; Vielleicht möchten Sie diesen Ansatz in Betracht ziehen.

Sie sollten beachten, dass die Schnittstelle exitcode-stdio-1.0 als semi-deprecated gilt; Die Cabal-Betreuer empfehlen, zu ihrer eher haskellschen detailed-0.9 Schnittstelle zu wechseln.

+0

Ich hatte in 'Detailed-0,9' nachgeschaut, aber [bekam die Stimmung] (http://Stackoverflow.com/a/18686329/656912), dass es weniger stabil und schwer zu verwenden war. – orome

+0

@raxacoricofallapatorius, könnte sein. Ich habe mich auch nie damit herumgeschlagen; Ich habe nur ein paar Erweiterungen bestehender Testsuiten in bestehenden Projekten durchgeführt. – dfeuer

+0

@dfeuer: Ich habe Ihren Ansatz mit 'ExitSuccess' und' ExitFailure' verwendet, aber es funktioniert aus irgendeinem Grund nicht, wenn ich 'cabal test --show-details = 'always''ausführe - Build sagt Testsuite: PASS obwohl Es gibt einen Fehler. Könnten Sie bitte einen Workaround empfehlen? – altern

Verwandte Themen