【问题标题】:Sonarcube is not covering code for the mainSonarqube 不涵盖主要代码
【发布时间】:2018-12-08 08:07:00
【问题描述】:

您好,我的代码覆盖工具是声纳。我有这样简单的主要方法:-

public class MAIN {

    public static void main(String[] args) 
    {
        //System.setProperty("hadoop.home.dir", "C:\\software\\winutils");

        //args[0]:- location of the input file args[1]:- ingest date args[2]:- source
        //args[3]:-location of the output file args[4]:-location of the Error file
        //args[5]:-Type of the input file args[6]:-Type of the output file
        String input = args[0];
        String ingestDate = args[1];
        String source=args[2];
        String output=args[3];
        String error=args[4];
        String inputFileType=args[5];
        String outputType=args[6];
    }

}

这个测试类是:-

 public class MyTest {

    private String inputFilePath;
    private String inputFileType;
    private String ingestDate;
    private String source;
    private String outputPath;
    private String errorPath;
    public Main driver;

    @Test(expected=IndexOutOfBoundsException.class)
    public void testMainIncorrectArgs() throws IOException{
        //String[] args = {inputFilePath, inputFileType, ingestDate, source, outputPath, errorPath};
        driver = new MAIN();
        driver.main(new String[]{inputFilePath, inputFileType, ingestDate, source, outputPath, errorPath});
    }

}

当我进行代码覆盖时,sonarcube 工具不包括主类代码覆盖。 我曾尝试使用 PowerMockitoReflection Api 来调用该方法,但结果相同。

【问题讨论】:

  • 你为什么要这样做driver = new MemberEligibilityEtlSparkDriver();而不是driver = new Main();
  • @piy26 已编辑请检查
  • 你能插入一些实际执行的行吗? . .类似System.out.println(inputFilePath, inputFileType, ingestDate, source, outputPath, errorPath)
  • 1) 你知道你的MyTest 类中的单元测试是否真的被执行了吗? 2)你不需要实例化一个类来执行一个静态方法.......
  • 是的,实际上所有测试都在本地执行,但静态类代码没有发生代码覆盖

标签: java junit sonarqube code-coverage main


【解决方案1】:

我得到了答案。因此,Sonar 在内部使用 jacoco 库进行代码覆盖。 在我的主要方法中,我从 args 声明变量:-

String input = args[0];
String ingestDate = args[1];
String source=args[2];
String output=args[3];
String error=args[4];
String inputFileType=args[5];
String outputType=args[6];

因此,根据 jacoco 文档,这些代码不包含在代码覆盖范围内。 最后我使用 pojo 修改了我的代码:-

 String input = setInput(args[0]);
    String ingestDate = setInput(args[1]);
    String source    = setInput(args[2]);
    String output    = setInput(args[3]);
    String error     = setInput(args[4]);
    String inputFileType= setInput(args[5]);
    String outputType = setInput(args[6]);

覆盖了我的声纳。 :)

【讨论】:

    【解决方案2】:

    如果我理解正确,您正在使用 SonarQube 进行静态代码分析并寻找测试覆盖的代码。

    据我所知,SonarQube 不会自行生成代码覆盖率,而是使用完成工作的外部工具。最常见的是Jacoco,它还有一个可以包含在构建中的 maven 插件。 然后可以将生成的覆盖率报告包含在您的 SonarQube 分析中。 现在您的代码覆盖率应该为零,因为 SonarQube 不会自行进行分析。

    如果您需要示例或更多信息,请随时编辑您的问题。

    【讨论】:

    • 除此文件代码外,所有测试用例的代码都被覆盖。由于总代码覆盖率为 60%,但不包括主要方法代码覆盖率。
    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 2020-04-20
    • 2014-08-19
    • 2017-01-06
    • 1970-01-01
    • 2019-07-06
    • 2017-03-26
    相关资源
    最近更新 更多