如何计算关于Web应用程序代码的selenium测试的代码覆盖率

时间:2014-01-03 12:53:35

标签: java javascript selenium code-coverage jacoco

我要求将我的selenium测试的代码覆盖率捕获到所涵盖的服务器代码(Web应用程序源代码)中的源代码量。

例如,登录功能的测试应捕获Web应用程序中为登录功能所涵盖的代码量。

否则,需要知道在完成方案的Web应用程序代码中触及了哪个包或类。例如登录

我找不到合适的解决方案,虽然我开始了解Jacoco代码覆盖工具并尝试使用Jacoco Jenkins插件的一些示例,但没有成功。

我不知道可能性。请提前告知我如何实现这一目标,提前致谢

2 个答案:

答案 0 :(得分:16)

确保你这样做。请注意,如果您使用的是Gradle,Maven或ANT。但是以下概念与任何构建系统非常相似。

  1. 您必须拥有一个.war / .ear应用程序工件,您需要在Tomcat /类似之后运行。
    • 您还需要确保在调试模式下编译主代码,否则jacoco将不满意。
    • 对于ex:Java中的-g选项和类似的调试选项(如果你使用的是groovy)。

  2. tasks.withType(Compile) {
        options.debug = true
        options.compilerArgs = ["-g"]
    }
    


    1. 假设您拥有.war并使用Tomcat。然后在启动Tomcat时。
      • 在Tomcat启动脚本中,确保告诉Tomcat的JVM jacocoagent.jar文件并传递其他参数。这是我们看到的主要缺失点(也就是没有将jacoco附加到目标JVM的会话并试图获得代码覆盖)。
    2. 例如:我使用传递给Tomcat的以下参数启动我的Tomcat脚本(-Dxxxx = value way)

      PROJ_EXTRA_JVM_OPTS=-javaagent:tomcat/jacocoagent.jar=destfile=build/jacoco/ST/jacocoST.exec,append=false
      

      基本上,Tomcat启动脚本将具有-Dparameter = value,您可以将上述参数(Linux / Unix export 变量)传递给Tomcat / Target JVM的范围。

      上面的参数行发送到Tomcat时,会将JACOCO代理.jar文件附加到“TARGET”(又名Tomcat JVM)。在这里,您告诉Tomcat要从工作区下面的名为“tomcat”的导向器中查找jacocoagent.jar文件。它将在build / jacoco / ST文件夹下创建一个名为“jacocoST.exec”(也就是Selenium Test的jacoco exec文件)的jacoco .exec文件(我正在使用Gradle,因此Gradle会在您运行构建/编译时创建“build”文件夹/测试/ integrationTest / customSeleniumTaskThatYouMightHaveCreated)。

      注意:这意味着,您不必在测试任务中指定jacoco部分(因为它将在您的BUILD系统的JVM中运行Gradle或Maven或ANT,无论您拥有什么)。

      //We don't need jacoco for non-unit tests type of tasks as Jacoco won't be able to find any coverage if done this way. Jacoco agent file needs to be attached/visible to the TARGET's JVM (where you run your application via a .war / .ear etc).
      
      jacoco { 
        //  ... As Gradle runs Unit tests (while doing build), they run free, in the same JVM where Gradle runs the build so Unit test have visibility to the main classes in the same JVM (which Gradle is using to run the build). Thus, you can use jacoco section in Gradle for running unit tests. BUT,
        // ... Don't use this section for running Integration, Acceptance, Selenium tests which run on a target JVM. Instead attach jacocoagent.jar and specify jacoco parameters to the target JVM.
      }
      
      1. 启动并运行Tomcat后,现在运行Selenium测试。 注意: - 我在Linux / Unix机器上使用Jenkins,而且“xvfb”插件非常方便,即现在我可以在HEADLESS模式下运行Selenium GUI测试,我不会在运行测试的机器上通过弹出错误任何用户GUI测试运行时的测试页面。

        - 如果您最终在Jenkins中使用“ xvfb ”插件,那么 FIRST 需要在服务器上启动“ Xvfb ”服务(Linux / Unix)您正在运行测试。

        - 如果您在Windows计算机上运行非单元测试(也称为Integration / Selenium等),则可以在运行测试时看到GUI测试弹出。如果您不想看到弹出窗口,那么您的Jenkins实例可以将从属(您的Windows机器)进程作为服务运行(“作为服务安装”)。如果您将Windows计算机创建为从属计算机,则在计算机上运行JLNP安装时,您将看到Jenkins已成功启动从属进程的弹出窗口,单击文件>作为服务安装将在Windows机器上以“HEADLESS”运行您的从属。

      2. 当您的测试正在运行时,您会注意到,这次,jacoco将根据您对 destfile 参数的定义值创建文件夹结构/ exec文件,但它仍然是0或一些小尺寸。

      3. 完成Selenium /非单元测试后,您必须“停止”Tomcat /目标JVM。这将把所有jacoco覆盖信息刷新到这个jacocoST.exec文件(您希望jacoco创建的自定义文件)。 - 注意:如果你想快速刷新jacocoST.exec文件(不需要停止Tomcat JVM /会话,那么你可以查看jacoco文档如何做到这一点,那里有一个主题可以告诉你,通过这种方式,您的应用程序可以继续运行,您无需停止应用程序/ Web服务。

      4. 运行jacocoTestReport任务,您将看到jacoco代码覆盖率。

        • 确保指定主代码的来源/类的位置。
      5. 代表:

          jacocoTestReport {
              group = "Reporting"
              description = "Generate Jacoco coverage reports after running tests."
              ignoreFailures = true
        
        
              //UT=is for Unit tests, IT=integrationTest, AT=acceptanceTest, ST=Selenium GUI tests.
              //executionData = files('build/jacoco/UT/jacocoUT.exec')
              //executionData = files('build/jacoco/IT/jacocoIT.exec')
              //executionData = files('build/jacoco/UT/jacocoUT.exec', 'build/jacoco/IT/jacocoIT.exec')
        
              //executionData = files(['build/jacoco/UT/jacocoUT.exec', 'build/jacoco/IT/jacocoIT.exec'])
              //OR use the following way for all.
              executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')
        
              reports {
                     xml{
                         enabled true
                         //Following value is a file
                         destination "${buildDir}/reports/jacoco/xml/jacoco.xml"
                     }
                     csv.enabled false
                     html{
                         enabled true
                         //Following value is a folder
                         destination "${buildDir}/reports/jacoco/html"
                     }
              }
        
              //sourceDirectories = files(sourceSets.main.allJava.srcDirs)
              sourceDirectories = files('src/java')
              //sourceDirectories = files(['src/java','src/groovy'])
              classDirectories =  files('build/classes/main')
        
              //------------------------------------------
              //additionalSourceDirs = files(['test/java','test/groovy','src/java-test', 'src/groovy-test'])
              //additionalSourceDirs += files('src/java-test')
        }
        

        如果您仍然发现任何问题,请随时与我联系。您还可以在stackoverflow上看到我的一些帖子,关于我如何实现这一点,并将相同的报道发布到SonarQube。

答案 1 :(得分:1)

毯子可以工作。

这是一个JavaScript库。

您使用'数据封面'在HTML页面中注释导入。属性:

<script src="sourceScript.js" data-cover></script>

...并且使用带注释的副本替换您的JS文件,这些副本向自身报告统计信息。

重要的一步是从毯子中获取代码覆盖率统计信息,但如果我没有弄错,Selenium有一个允许您在浏览器引擎中执行JavaScript函数的接口。 API在这里:

https://github.com/alex-seville/blanket/blob/master/docs/advanced_browser.md