在Play上使用Clover执行代码覆盖!使用Ant的框架应用程序

dig*_*nie 12 java build clover playframework

我正在编写一个Ant脚本来对我的Play 进行一些额外的检查!框架应用.

目前,我正在通过执行exec调用"播放自动测试"从我的Ant脚本执行我的测试.

    <exec executable="${play.dir}/play.bat">
        <arg line="auto-test"/>
    </exec>
Run Code Online (Sandbox Code Playgroud)

有谁知道如何将Clover集成到Play测试套件中?显然,我并不依赖于必须使用上述方法运行我的测试.

我也尝试使用执行JUnit测试的传统方式编写Ant脚本(即使用Ant的junit目标),我遇到了两个问题:

  • 执行所有测试时,只有第一个会成功执行,而其他测试会因奇怪的原因而失败
  • 如果我只是在我的套件中公开一个测试并且测试成功运行,那么我会说代码覆盖率为0%.然后我认为我错误地设置了三叶草,但是,我创建了一个简单的类,它测试了一个什么也没做的生产类,覆盖率也达到了我的预期.

因此,如果我要沿着这junit条路走下去,我需要知道如何执行我所有的测试,以便它们可以一个接一个地成功运行(它在使用Play运行方式时有效play auto-test)我需要知道为什么Clover会这样做似乎没有找到Play测试触及的代码行.

(我知道有一个用于播放的Cobertura模块,但是,我发现Clover做得更好,告诉我一个准确的覆盖数字)

更新:不幸的是我无法复制我之前遇到的确切错误,因为当我尝试手动编译时遇到了编译问题.我已经开始使用Secure模块,它只包含Java源文件.因此,在我的Ant脚本中,我调用play precompile哪个产生Secure模块的字节代码(以及系统中的所有其他内容,包括我的代码).所以现在当我尝试使用Clover编译我的应用程序代码时,我认为编译器有点纠结,因为我有两个版本的类 - 一个由预编译命令(非三叶草)生成,一个由我自己生成蚂蚁编译(与三叶草):

[javac] C:\projects\testproject\out\clover\classes\clover8583527041716431332.tmp\model\HouseTest.java:45: incompatible types
[javac] found   : play.db.jpa.JPABase
[javac] required: models.House
[javac]         __CLR2_5_115y15ygoxiz3dv.R.inc(1527);House found = House.findById(id);
Run Code Online (Sandbox Code Playgroud)

所以我现在基本上有两个问题:

  • 我需要能够编译我的源代码,这些源代码也依赖于Play提供的模块(例如CRUD,Secure),这些模块没有编译版本,因此我尝试通过play precompile在Ant脚本中调用自己来解决它
  • 一旦我开始编译工作,我无疑会再次遇到原始问题,即无法使用junit目标执行测试.

更新#2:事实证明我得到的错误是由于findById调用需要从JPABase转到House(而不是IDE或者游戏似乎关心它).所以在我进入并为所有play的"find*"方法投了一个演员之后,我实际上得到了JUnit和Clover的报道! 但是......我现在遇到两种错误:

  • 在Play中创建的实体类可以通过扩展Model提供魔术方法的类来创建,例如find前面提到的那些方法以及count方法.Model超类实际上扩展了GenericModel,它通过抛出UnsupportedOperationException来实现这些方法.所以显然玩!在幕后做一些更神奇的事情来提供这些方法的实际实现.不幸的是,我的测试(和生产代码)依赖于计数等方法,但它们在我的ant/junit场景中抛出异常(注意:运行时一切正常play auto-test.

  • 我得到的另一个错误是由于我使用Spring模块.在我的一个类(根类)中,我打电话Spring.getBeanOfType(Some.class).现在我使用自动扫描,但是在ant/junit测试环境中,Spring模块还没有设置我的spring容器,因此调用只返回null.

我有一种感觉,有一个神奇的解决方案可以解决我的两个问题但是我不确定这个神奇的修复是什么.

Ron*_*Ron 4

Clover 进行源级检测,因此需要可用的源代码。在激活生成字节码的 clover 之前所做的一切都不会被“clovered”。

Clover for ant 会拦截 ant-compiler 调用,因此如果您<clover-setup/>在 ant 脚本中执行任何其他编译任务之前执行此操作,则所有内容都应由 Clover 进行检测。

您可以以任何您想要的方式执行生成的编译代码,例如从脚本或从 junit 执行,这并不重要,只要代码被检测(当然 clover.jar 在类路径中可用)。Clover 将 clover 数据库的位置硬编码到检测代码中,因此您在执行时不必指定任何内容。

如果您能够概述如何使用 clover,并且您还可以在http://confluence.atlassian.com/display/CLOVER/1.+QuickStart+Guide上的 clover 文档中进行重新检查,那将会非常有帮助。