如何在Java中获得最佳代码覆盖率?

elh*_*oim 0 java testing algorithm code-coverage

存在一些允许计算一组测试的路径覆盖率的工具,但是是否有一个工具(或算法)可以建议值以尽可能少的测试获得最佳路径覆盖?

例如,使用以下类:

public class User {

    private boolean isAdmin = false;
    private String name;
    private String password;

    public User(String name, String password, boolean isAdmin) {
        this.name = name;
        this.password = password;
        this.isAdmin = isAdmin;
    }

    public boolean isAdmin() {
        return isAdmin;
    }

    public boolean authenticate(String name, String password) {
        if (name.equals(this.name) && password.equals(this.password)) {
        return true;
        } else {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
public class DataRepository {

    List<String> data = new ArrayList<String>();

    public void add(String dataPiece) {
        data.add(dataPiece);
    }

    public void clearAll(User userAuthenticated) {
        if (userAuthenticated.isAdmin()) {
            data.clear();
        }
    }

    public void addAll(User userAuthenticated, List<String> collection) {
        if (userAuthenticated.isAdmin()) {
            data.addAll(collection);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我创建它使用一个测试,我会得到一个更好的测试覆盖用户isAdmin真实.

是否有一个工具可以提及:如果您使用isAdmintrue的用户创建测试,您将获得最佳测试覆盖率.

类似的东西,但对于更复杂的情况,并检查所有代码分支.

And*_*yle 6

你在谈论什么"价值观"暗示?

代码覆盖通过检查在特定会话期间执行哪些行/方法/类等来工作.这通常在运行自动化单元测试时使用,但不一定是这样(例如,您可以在部署Web应用程序之前进行烟雾测试,以了解您在特定测试中未涵盖的代码路径) .

增加覆盖范围的方法只是确保在正在测量的任何内容(例如单元测试)的上下文中,使用执行更多内部分支的参数调用更多方法.没有工具是要确切地告诉你写什么要做到这一点-他们强调什么还没有经过测试,它是由你来编写测试,将这样做.

除非您的问题是"哪种覆盖工具为覆盖率提供了最高的测量值",否则在评估适用性时这是一个不好的标准.

编辑 - 您还需要意识到测试的目标不是获得良好的覆盖率.代码覆盖率仅用于显示哪些代码绝对未经过测试.一个类仍然可以有100%的覆盖率而没有任何有用的测试(例如,没有任何断言的那些 - 或更常见的是,其断言也通过一些失败值的那些).

因此,如果您只是为了获得覆盖而编写测试,那么您的测试将是垃圾并且不会给您任何东西.编写测试最初只考虑类的功能,只有当你想到"我已经完成"时,才能通过覆盖工具运行它.使用该工具的输出可以查看尚未执行的代码块,这可能表明您需要编写更多传递不同输入的测试.最重要的是,在编写测试时,始终要确定您正在测试的是什么以及哪些输出应该构成通过和失败.

  • +1"测试的目标不是获得良好的覆盖率分数"完全正确! (2认同)

bri*_*gge 5

Clover的功能是向您展示经过严格测试的高度复杂的代码.这很好,所以你不要浪费时间通过测试getter和setter来增加代码覆盖率.

许多工具可以计算函数的圈复杂度.如果此值为高,则您无法测试该函数的所有排列.

代码覆盖是一种手段 - 而不是目的.代码覆盖率并不能证明代码是正确的,并且覆盖工具仅作为它可以帮助您发现的错误.