Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Haskell计划覆盖范围未突出显示完全没有测试的模块_Unit Testing_Haskell_Cabal - Fatal编程技术网

Unit testing Haskell计划覆盖范围未突出显示完全没有测试的模块

Unit testing Haskell计划覆盖范围未突出显示完全没有测试的模块,unit-testing,haskell,cabal,Unit Testing,Haskell,Cabal,我已经开始使用haskell应用程序,我想看看构建工具的行为。我想看到的一件事是Haskell覆盖率报告,通过hpc(Haskell Program coverage->我没有在上面找到这个标签,所以hpc指向高性能计算,附带说明) 我的应用程序的结构是 Main src/ ModuleA ModuleB tests/ ModuleBTest 我有moduleB的单元测试,我通过cabal测试运行这些单元测试。之前,我配置cabal通过 cabal configure --g

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

我的应用程序的结构是

Main
src/
   ModuleA
   ModuleB
tests/
   ModuleBTest
我有moduleB的单元测试,我通过cabal测试运行这些单元测试。之前,我配置cabal通过

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

问题是,我希望在hpc输出中看到moduleA弹出,完全以黄色突出显示,并向我挥手表示该模块没有测试,但事实似乎并非如此。我注意到.mix文件是为这个“未使用的”模块创建的,所以我怀疑构建步骤进行得很顺利,但在cabal测试步骤中出错了

如果我通过ghci编译单元测试,而在要编译的模块列表上显式地显示moduleA,那么我会让hpc告诉我这个模块根本没有测试。所以我怀疑阴谋集团在某处优化了这个模块(因为它是“未使用的”),但我真的不知道如何或在哪里

现在,我确实意识到这可能不是一个真实的情况,因为moduleA只是从主方法中引用,moduleB没有引用moduleA,我也没有测试主模块(还没有),但如果它至少在我的测试中显示为战舰大小的洞,我会感觉好多了。有人有主意吗

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


Kasper

首先,确保所有模块都列在
其他模块
阴谋集团字段中。
尽管根据我的经验,有时应用程序似乎在不指定所有内容的情况下按自己的方式运行,但它通常会导致神秘的链接问题,我认为这可能会导致类似您的情况

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


2.1死代码消除 GHC是否会删除您实际未使用的代码

是和否。如果模块中有未导出的内容 没有被导出的任何东西使用,它将被忽略。(这使得 编译后的程序更小。)所以在模块级,是的,GHC会 死代码消除

另一方面,如果您导入一个模块并仅从中使用一个函数 它将链接该模块中所有函数的所有代码 在里面所以从这个意义上说,GHC不做死代码消除

(有一个开关可以使GHC为其输出一个单独的对象文件。) 模块中的每个单独函数。如果使用此函数,则 实际使用的函数将链接到可执行文件中 这会使链接器程序崩溃……)

如果您想得到关于未使用代码的警告(为什么会有它 如果没有使用?你忘了键入什么吗?)你可以使用 -fwarn未使用的绑定选项(或just-Wall)


-

感谢您提供有关其他模块的提示。我读到,这似乎并没有解决我的特殊问题,但这确实是阴谋集团的最佳实践。我也在阴谋集团的问题清单上提出了这个特殊的问题,他们在那里回答我说,它似乎在按预期工作。我仍在等待一些反馈,看看为什么我“强迫”GHC使用moduleA(通过编译GHC moduleA moduleB moduleTestB),然后运行GHC构建的ModuleTest suite可执行文件(因为我在hpc报告中确实看到了moduleA)。@Kasper如果我理解正确,你应该重读我第二段的答案。它应该解释为什么它只出现在你的测试中。我不认为指定要编译的模块会迫使ghc编译它们。如果没有实际使用,ghc会消除。是的,我理解(我想),但我仍然看到,如果我在编译期间通过ghc将未在命令行上使用的模块放在命令行上,我似乎会得到hpc输出。这表明ghc并没有消除它,尽管你、ghc维基和阴谋集团问题列表上的某个人已经告诉我ghc确实消除了这些模块。我会尽快重试,看看这是否符合Fata Morgana的条件,开始怀疑自己:-)。好吧,看来确实是ghc优化了未使用的模块。不是在显式命名依赖项时,而是在放置include库时。最后,这一切似乎都是合乎逻辑的。我将看看我们现在将如何前进,无论我们是想保护自己不受“虚假”覆盖率的影响,还是假设当我们有足够的测试时,它最终会自行解决。@Kasper我很高兴一切都清楚了。我发现这很奇怪,因为没有办法控制这种行为,我认为最好的办法是在测试中使用一个虚拟用法,因为您向cabal添加了一个模块(因此不会遗漏任何模块)。对于大型项目,如果值得的话,也许您可以生成这些类型的测试&通过您的cabal包的
Setup.hs
“脚本”将它们包括在内。