Kas*_*per 6 haskell unit-testing cabal
我有一个haskell应用程序的开始,我想看看构建工具的行为.我希望看到的一件事是Haskell覆盖报告,通过hpc(Haskell程序覆盖 - >我没有找到这个标签,hpc指向高性能计算,侧面说明).
我的应用程序的结构是
Main
src/
ModuleA
ModuleB
tests/
ModuleBTest
Run Code Online (Sandbox Code Playgroud)
我有moduleB的单元测试,我通过cabal测试运行这些单元测试.在此之前,我将cabal配置为通过吐出hpc数据
cabal configure --ghc-options=-fhpc --enable-tests
Run Code Online (Sandbox Code Playgroud)
然后我构建并测试,
cabal build
cabal test unit-tests (that's the name of the test suite in the cabal file)
Run Code Online (Sandbox Code Playgroud)
我确实看到了一份报告,一切似乎都很顺利.但是,moduleA不是在moduleB中引用的,它只是从Main引用的.我还没有为主模块进行测试.
问题是,我希望看到moduleA在hpc输出中弹出,完全以黄色突出显示,并且真的向我挥手说这个模块没有测试,但似乎并非如此.我注意到.mix文件是为这个'未使用的'模块创建的,所以我怀疑构建步骤没问题但是在cabal测试步骤中出错了.
如果我通过ghci并编译单元测试,同时在模块列表上显式moduleA进行编译,那么我确实得到hpc来告诉我该模块根本没有测试.所以我怀疑cabal在某个地方优化了这个模块A(因为它'未使用'),但我真的不知道如何或在哪里.
现在,我确实意识到这可能不是真实的生活情况,因为moduleA仅在main方法中引用,moduleB不引用moduleA而我不测试Main模块(还),但我仍然会如果它至少在计划覆盖范围中显示为我的测试中的一个洞,就像战舰的大小一样,感觉好多了.有人有想法吗?
注意:我意识到我的问题可能归结为:"我如何告诉cabal不要优化未使用的模块?" 但我想提出完整的问题.
卡斯帕
首先,确保所有模块都列在other-modulescabal 字段中。
尽管根据我的经验,有时应用程序似乎可以在没有指定所有内容的情况下自行工作 - 它通常会导致神秘的链接问题,并且我认为它可能会导致像您这样的情况。
现在,除此之外,我不认为 cabal 会像那样优化你的模块,而是 GHC 的死代码消除。因此,如果您的代码根本没有被使用(每个模块只需要存在一个实际用法),GHC 甚至不会关心它。
不幸的是我还没有看到可以改变这一点的标志。您可能希望对测试项目中的每个模块进行无意义的使用,只是为了让事情可见。
2.1 死代码消除
GHC 是否会删除您实际未使用的代码?
是和不是。如果模块中的某些内容未导出且未被导出的任何内容使用,则会被忽略。(这会使你编译的程序更小。)所以在模块级别,是的,GHC 确实消除了死代码。
另一方面,如果您导入一个模块并仅使用其中的一个函数,则该模块中所有函数的所有代码都会被链接进来。所以从这个意义上说,不,GHC 不会消除死代码。
(有一个开关可以让 GHC 为模块中的每个函数生成一个单独的目标文件。如果使用此开关,则只有实际使用的函数才会链接到可执行文件中。但这往往会吓坏链接器程序。 ..)
如果您想收到有关未使用代码的警告(如果未使用,为什么还会有它?您是否忘记输入某些内容?),您可以使用 -fwarn-unused-binds 选项(或只是 -Wall)。