我正在使用“ Jacoco 0.8.0”。 我在所有情况下都有一个带有测试的switch语句。 Jacoco在switch语句中的每种情况下均标记抛出和中断。 默认大小写和分隔符未标记。 为什么要标记这些?

我四处张望,发现这样的帖子说以前的版本没有针对switch语句的过滤器: JaCoCo为什么不覆盖我的String switch语句?

但是我正在运行此修补程序之后的0.8.0,问题有点不同。

MRE:

public class MyClass{

    public void myMethod(String let) {
           switch (let) {
               case "A":
                   throw new Exception();
                   break;

               default:
                   break;
           }
      }

}

每个测试:

@Test(expected = Exception.class)
    public void testMyMethodA() {
        MyClass class = new MyClass();
       class.myMethod("A");
    }

@Test(expected = Exception.class)
    public void testMyMethodDefault() {
        MyClass class = new MyClass();
       class.myMethod("Z");
    }

标志示例:

public class MyClass{

    public void myMethod(String let) {
[YELLOW]  switch (let) {
               case "A":
[RED]          throw new Exception();
[RED]          break;

               default:
                   break;
           }
      }

}

Jacoco将throw语句和breaks标记为未经测试。 它将交换机标记为已部分测试。 我希望这些会被覆盖。

#1楼 票数:2 已采纳

首先,您的MRE

public class MyClass{

    public void myMethod(String let) {
           switch (let) {
               case "A":
                   throw new Exception();
                   break;

               default:
                   break;
           }
      }

}

不能被编译

javac --version
javac 11.0.3

由于以下错误

javac MyClass.java
MyClass.java:7: error: unreachable statement
                   break;
                   ^
MyClass.java:6: error: unreported exception Exception; must be caught or declared to be thrown
                   throw new Exception();
                   ^
2 errors

如果您来看看JaCoCo主页,您会注意到0.8.0已有将近两年的历史,而最新版本是0.8.4。

JaCoCo更改日志位于其通常的位置, 网址为https://www.jacoco.org/jacoco/trunk/doc/changes.html,其中包含

版本0.8.2(2018/08/21)

  • 现在,在生成报告的过程中,javac为java.lang.String值上的少量语句的switch语句生成的字节码部分已正确过滤掉(GitHub #730 )。

因此,对于更正的例子

class Example {
    public void myMethod(String let) {
        switch (let) {
        case "A":
            throw new RuntimeException();
        default:
            break;
        }
    }

    public static void main(String[] args) {
        for (String s : new String[]{"A", "B"}) {
            try {
                new Example().myMethod(s);
            } catch (Exception ignore) {
            }
        }
    }
}

JaCoCo 0.8.4产生以下预期报告

javac Example.java -d classes

java -javaagent:jacoco-0.8.4/lib/jacocoagent.jar -cp classes Example

java -jar jacoco-0.8.4/lib/jacococli.jar report \
    jacoco.exec \
    --classfiles classes \
    --sourcefiles . \
    --html report

报告


根据经验并引用JaCoCo发布公告

一如既往,我们建议您使用最新发布的版本

  ask by Tack translate from so

未解决问题?本站智能推荐:

1回复

jacoco检查中的错误-参数“规则”丢失或无效

这是我在运行 mvn jacoco:check for a maven application 时遇到的错误。 因此,不会生成报告。 这是我在 pom.xml 中的 jacoco 插件。 我觉得规则没问题。 我想知道缺少什么... ---------------------------------
2回复

jacoco显示行未覆盖,尽管在运行代码时执行了这些行

我有以下代码行,它们被Jacoco指示为未“执行”。 但是,当我调试测试用例时,它会执行这些行。 以下是我编写的测试用例。 怎么了 为什么Jacoco显示未执行的行? 请指教。
1回复

SpringBootUnit测试端点NullPointerException-以及如何达到100%覆盖率

我是Spring Boot测试的新手,我正在尝试测试和端点。 按照教程,我这样做了: 如果我运行测试,则会传递,但控制台中会显示以下错误: RestController类如下: 是什么导致错误? 此外,即使这个测试通过,运行Jacoco我没有覆盖方法“homePage”。 我
2回复

Jacoco是否记录单位测试持续时间?

您可以使用Jacoco代理运行JUnit测试以生成精彩的覆盖报告。 (它在运行单元测试期间生成一个不透明的*.exec文件)。 一些工具,如Sonar - 读取*.exec文件并收集数据以生成报告。 Sonar能够告诉Unit测试持续时间 - 但我不确定它是否从这个*.exec文件中获取
2回复

jacoco测试报告不排除一个包裹

我试图从 jacoco 覆盖范围中排除整个包,但它不起作用。 我已经按照这个答案Filter JaCoCo coverage reports with Gradle 中报告的说明进行了操作,但它似乎对我不起作用。 这是代码: 我还尝试了排除 += 等变体,写作 并且还通过添加 但仍然无法正常工作。
2回复

JaCoCo的程序测试覆盖率

我正在使用JaCoCo测试一个简短的程序,并且我几乎达到了100%的覆盖率,除了这是我似乎无法测试的唯一陈述,我可以编写什么测试套件来覆盖整个程序? 下面是代码。
1回复

JaCoCo不忽略课程

我已经成功将JaCoCo添加到我的项目中,它可以正常工作,但是由于某种原因,它不允许我排除类: src / main / java / com / example / Main.java 我已经在网站上尝试了其余问题,但是在排除单个班级时,没有一个对我有用。 执行完上面的代码后,我得到以下
3回复

有没有办法仅在新代码上获得单位覆盖率(例如来自jacoco)?

我的假设场景是这样的: 我已经运行了我的 junit 测试并生成了一个 jacoco 文件 我的 git diff 显示我更改了 10 行代码现在我的 git diff 和 jacoco 信息的交集是覆盖了更改的 10 行代码中的 7 行。 即 - 我对新代码有 70% 的覆盖率。 但我必须手动解