首页 文章

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

提问于
浏览
12

我正在编写一个Ant脚本来在我的Play上做一些additional checks!框架应用 .

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

<exec executable="${play.dir}/play.bat">
        <arg line="auto-test"/>
    </exec>

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

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

  • 执行所有测试时,只有第一个会成功执行,而其他测试会因奇怪的原因而失败

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

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

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

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

[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);

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

  • 我需要能够编译我的源代码,这些源代码也依赖于Play提供的模块(例如CRUD,Secure),这些模块没有编译版本,因此我尝试通过在我的Ant脚本中调用 play precompile 来绕过它

  • 一旦我开始编译工作,我无疑会再次遇到原始问题,即无法使用 junit 目标执行测试 .

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

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

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

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

1 回答

  • 4

    Clover执行源级别检测,因此需要可用的源代码 . 在激活生成字节码的三叶草之前,您所做的一切都不会被“收缩” .

    用于ant的Clover拦截了反编译器调用,所以如果你在ant脚本中的任何其他编译任务之前执行 <clover-setup/> ,那么所有内容都应该由clover检测 .

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

    如果您可以概述如何使用三叶草,那么这将非常有帮助,您还可以在http://confluence.atlassian.com/display/CLOVER/1.+QuickStart+Guide处对三叶草文档进行重新检查 .

相关问题