仅使用Hunit在Haskell中创建并运行最小测试套件

zmeyuzjn  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(158)

我对Haskell还比较陌生,所以如果我的术语不太正确,请提前道歉。
我想为一个非常简单的项目实现一些简单的单元测试,通过cabal管理。我注意到this very similar question,但它没有真正帮助。This one也没有(它提到了tasty,见下文)。
我 * 认为 * 我可以通过只使用HUnit来实现这一点-然而,我承认我对网上指南所谈论的所有其他“事情”有点困惑:

  • 我不太了解exitcode-stdio-1.0detailed-0.9接口之间的区别
  • 我不确定使用HUnitQuickcheck或其他方法的差异(或中长期)含义?
  • HUnit指南中提到的tasty的作用是什么?

因此,我尝试将所有“附加”软件包排除在等式之外,并尽可能地将其他所有软件包作为“默认”软件包,并执行了以下操作:

$ mkdir example ; mkdir example/test
$ cd example
$ cabal init

然后编辑example.cabal并添加以下部分:

Test-Suite test-example
    type:             exitcode-stdio-1.0
    hs-source-dirs:   test, app
    main-is:          Main.hs
    build-depends:    base >=4.15.1.0,
                      HUnit
    default-language: Haskell2010

然后我创建了包含以下内容的test/Main.hs

module Main where

import Test.HUnit

tests = TestList [
    TestLabel "test2"
        (TestCase $ assertBool "Why is this not running," False)
                 ]

main :: IO ()
main = do
    runTestTT tests
    return ()

最后,我试着运行整个地段:

$ cabal configure --enable-tests && cabal build && cabal test
Up to date
Build profile: -w ghc-9.2.4 -O1
In order, the following will be built (use -v for more details):
 - example-0.1.0.0 (test:test-example) (additional components to build)
Preprocessing test suite 'test-example' for example-0.1.0.0..
Building test suite 'test-example' for example-0.1.0.0..
Build profile: -w ghc-9.2.4 -O1
In order, the following will be built (use -v for more details):
 - example-0.1.0.0 (test:test-example) (ephemeral targets)
Preprocessing test suite 'test-example' for example-0.1.0.0..
Building test suite 'test-example' for example-0.1.0.0..
Running 1 test suites...
Test suite test-example: RUNNING...
Test suite test-example: PASS
Test suite logged to:
/home/jir/workinprogress/haskell/example/dist-newstyle/build/x86_64-linux/ghc-9.2.4/example-0.1.0.0/t/test-example/test/example-0.1.0.0-test-example.log
1 of 1 test suites (1 of 1 test cases) passed.

结果也不是我所期望的,我显然在做一些根本性的错误,但我不知道是什么。

j2cgzkjk

j2cgzkjk1#

为了让exitcode-stdio-1.0测试类型能够识别失败的测试套件,你需要安排测试套件的main函数在出现任何测试失败时退出。幸运的是,有一个runTestTTAndExit函数可以处理这个问题,所以如果你用以下内容替换你的main

main = runTestTTAndExit tests

它应该能正常工作。

相关问题