gpt4 book ai didi

unit-testing - Haskell 程序覆盖率没有突出显示根本没有测试的模块

转载 作者:行者123 更新时间:2023-12-03 14:33:40 34 4
gpt4 key购买 nike

我已经启动了一个 haskell 应用程序,我想看看构建工具的行为方式。我想看到的一件事是通过 hpc 的 Haskell 覆盖率报告(Haskell Program Coverage -> 我没有在上面找到这个标签,hpc 指向高性能计算,附带说明)。

我的应用程序的结构是

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 中引用的。我还没有针对 Main 模块的测试。

问题是,我希望在 hpc 输出中看到 moduleA 弹出,完全以黄色突出显示,并且真的在向我挥手说没有针对此模块的测试,但情况似乎并非如此。我注意到 .mix 文件是为这个“未使用”模块创建的,所以我怀疑构建步骤正常,但在 cabal 测试步骤中出错了。

如果我通过 ghci 并编译单元测试,同时在要编译的模块列表中明确地 moduleA,那么我确实让 hpc 告诉我这个模块根本没有测试。所以我怀疑 cabal 在某处优化了这个模块A(因为它'未使用'),但我真的不知道如何或在哪里。

现在,我确实意识到这可能不是现实生活中的情况,因为 moduleA 仅在 main 方法中被引用,moduleB 没有引用 moduleA 并且我还没有测试 Main 模块,但我仍然会有如果它至少在我的战舰大小的测试中作为一个漏洞出现在程序覆盖范围内,感觉会好很多。有人有想法吗?

注意:我意识到我的问题可能归结为:“我如何告诉 cabal 不要优化未使用的模块?”但我想提出完整的问题。

卡斯帕

最佳答案

首先,确保所有模块都列在 other-modules 中。 cabal 领域。
尽管根据我的经验,有时应用程序似乎可以在没有指定所有内容的情况下自行解决 - 它通常会导致神秘的链接问题,我认为它可能会导致像您这样的情况。

现在,除此之外,我认为 cabal 不会像那样优化您的模块,而是 GHC 的死代码消除。因此,如果您的代码根本没有被使用(每个模块只有一个实际使用情况),GHC 甚至不会关心它。
不幸的是,我还没有看到改变这一点的标志。您可能希望对测试项目中的每个模块进行无意义的使用,只是为了让事情可见。

2.1 Dead code elimination

Does GHC remove code that you're not actually using?

Yes and no. If there is something in a module that isn't exported and isn't used by anything that is exported, it gets ignored. (This makes your compiled program smaller.) So at the module level, yes, GHC does dead code elimination.

On the other hand, if you import a module and use just 1 function from it, all of the code for all of the functions in that module get linked in. So in this sense, no, GHC doesn't do dead code elimination.

(There is a switch to make GHC spit out a separate object file for each individual function in a module. If you use this, only the functions are actually used will get linked into your executable. But this tends to freak out the linker program...)

If you want to be warned about unused code (Why do you have it there if it's unused? Did you forget to type something?) you can use the -fwarn-unused-binds option (or just -Wall).



- GHC optimisations - HaskellWiki

关于unit-testing - Haskell 程序覆盖率没有突出显示根本没有测试的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782397/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com