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