如何计算 Selenium 测试相对于 Web 应用程序代码的代码覆盖率

2024-02-12

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

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

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

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

我不知道这种可能性。请向我提供有关如何实现这一目标的建议,提前致谢


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

  1. You must be having a .war/.ear app artifact that you need to run behind Tomcat / similar.
    • 您还需要确保在调试模式下编译主代码,否则 jacoco 会不高兴。
    • 例如:Java 中的 -g 选项和类似的调试选项(如果您使用的是 groovy)。
tasks.withType(Compile) {
    options.debug = true
    options.compilerArgs = ["-g"]
}
  1. Lets say you have the .war and using Tomcat. Then while starting Tomcat.
    • 在 Tomcat 启动脚本中,确保您告诉 Tomcat 的 JVM jacocoagent.jar 文件在哪里并传递其他参数。这是我们有时会看到的主要缺失点(也称为不将 jacoco 附加到目标 JVM 的会话并尝试获取代码覆盖率)。

例如:我启动 Tomcat 脚本,并将以下参数传递给 Tomcat(-Dxxxx=值方式)

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

基本上,Tomcat启动脚本都会有-Dparameter=value,你可以传递上面的参数(Linux/Unixexport变量)到 Tomcat/目标 JVM 的范围。

上面的参数行发送到 Tomcat 时,会将 JACOCO 代理 .jar 文件附加到“TARGET”(又名 Tomcat JVM)。在这里,您告诉 Tomcat 在您的工作空间下从名为“tomcat”的目录中查找 jacocoagent.jar 文件。它将在 build/jacoco/ST 文件夹下创建一个名为“jacocoST.exec”的 jacoco .exec 文件(又名 Selenium Test 的 jacoco exec 文件)(我正在使用 Gradle,因此 Gradle 会在您运行构建/编译时创建“build”文件夹) /test/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 测试运行时的测试页面。

    -- 如果你最终使用“xvfb“ Jenkins 中的插件,你FIRST需要开始”Xvfb“运行测试的服务器(Linux/Unix)上的服务。

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

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

  3. 一旦您的 Selenium/非单元测试完成,您必须“停止”Tomcat/目标 JVM。这会将所有 jacoco 覆盖信息刷新到此 jacocoST.exec 文件(您希望 jacoco 创建的自定义文件)。 -- 注意:如果您希望即时刷新 jacocoST.exec 文件(不需要 Tomcat JVM/会话停止,那么您可以查看 jacoco 文档如何做到这一点,那里有一个主题讲述了这一点,这样您的应用程序就可以继续运行,而不必停止您的应用程序/网络服务)。

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

    • 确保指定主代码的源/类在哪里。

for ex:

  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 发布相同的报道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算 Selenium 测试相对于 Web 应用程序代码的代码覆盖率 的相关文章

  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐