BiSection Java测试输入

2020年8月10日 3点热度 0条评论

我有要分析的代码。这是二等分法。

哪些输入将导致进入第18和19行的分支?

public class BiSectionExample {
    public double root(double d, double e, double f) throws IllegalArgumentException {
        double middle;
        if (d >= e) {
            System.out.println("1");
            throw new IllegalArgumentException("low must be lower than high");
        }

        System.out.println(d + " " + e + " " + f);
        while (e - d > f) {
            System.out.println("2");
            System.out.println("once");
            middle = (e + d) / 2;
            if (middle < e) {
                System.out.println("3");
                d = middle;
            } else {
                System.out.println("4"); // line 18
                e = middle; // line 19
            }
        }

        System.out.println((e + d) / 2);
        return (e + d) / 2;
    }
}

解决方案如下:

如果使用JUnit进行测试,则可以使用重复测试并输入随机生成的值,因此达到这些行的可能性很高。在行上设置调试器断点也很有用,这样您可以看到到达行时的输入内容。

但是,我认为通过手动进行测试是不可能的,因为:

middleed之间的中间
要使middle大于e(在其他情况下)d必须大于e
由于第一个if子句(在这种情况下会引发异常),因此似乎不允许这种情况

如果ed是相同的值(因此middle等于e而不是更小),这是可能的,但是由于双精度,这也可能失败。