Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法中每个可能的分支都应该有一个单独的junit吗?_Java_Unit Testing_Testing_Junit - Fatal编程技术网

Java 方法中每个可能的分支都应该有一个单独的junit吗?

Java 方法中每个可能的分支都应该有一个单独的junit吗?,java,unit-testing,testing,junit,Java,Unit Testing,Testing,Junit,这更像是一个设计问题 假设您有这样一个方法(作为示例): 您认为对每个可能的分支使用junit是最佳实践吗?例如,testx5、testxnot5znot2、testxnot5z2等,或类似于: void testMethod() { // x is 5 test/assert code; // x not 5, z not 2 test/assert code; // x not 5, z is 2 test/assert code // etc } 编辑:我的目标是完全覆盖代码。我只

这更像是一个设计问题

假设您有这样一个方法(作为示例):

您认为对每个可能的分支使用junit是最佳实践吗?例如,testx5、testxnot5znot2、testxnot5z2等,或类似于:

void testMethod() {
// x is 5
test/assert code;

// x not 5, z not 2
test/assert code;

// x not 5, z is 2
test/assert code

// etc
}

编辑:我的目标是完全覆盖代码。我只是想知道我是应该为每个分支做一个新的测试,还是将它们合并到一个测试中。感谢您的输入。

在单元测试中,您的目标是测试行为,而不是“代码”。想想你正在测试一个黑匣子的方法,你想看看它是否正常工作。您不知道它在内部是如何完成工作的,但您希望某些输入有一定的结果。因此,您可能希望为不同的情况创建测试,以了解您希望代码如何工作,就好像您不知道该方法的内部实际上是如何工作的一样。所以您需要编写类似“applysDiscountToShoppingCart”和“addsdeliveryfeethoppingcart”的测试


现在,尽管如此,创建“边缘案例”也很有用,在这些案例中,您正在测试可能会中断的内容(如空值、零值、负数、数据太大/太小等),以查看它是否也以预期的方式失败。通常要编写这些,您需要知道该方法实际上是如何工作的。如果您可以设计覆盖所有代码的测试,那就太好了!100%的测试覆盖率是一个明确的目标,但根据具体情况,它并不总是实用的(或有用的)。

尤其是在构建服务器上,拥有许多不同的测试用例/功能更容易,因为很容易识别哪些测试失败。另一个缺点是,如果第一个测试失败,测试用例将停止,并且您将不知道其他测试用例的结果


就我个人而言,当您必须进行大量的复制粘贴来设置/解释测试用例时,这种好处就停止了。在这种情况下,我将在同一个测试用例中执行几个断言。

您正在讨论的是所谓的分支覆盖率

传统的看法是,如果编写代码来覆盖该用例足够重要,那么编写测试用例来覆盖该代码就足够重要了。所以这似乎意味着100%的分支覆盖率是一个很好的目标(也意味着100%的语句覆盖率,但不一定是100%的循环覆盖率或100%的条件覆盖率)

但是,您还需要平衡编写测试的努力与获取这些测试的价值。例如,如果您正在测试的代码有一个try/catch来捕获一个检查过的异常,但是该异常几乎从未被抛出(或者很难在测试用例中引发),那么编写一个覆盖该异常的测试可能不值得您花费时间


这就是为什么您在很多地方看到,将测试覆盖率定为某个百分比是一个坏主意,因为您最终编写测试用例是为了获得覆盖率,而不是为了发现bug。在您的示例中,是的,每个分支都应该有自己的测试用例。在每一段生产代码中,这可能都是不必要的。

似乎表明最好使用较少的断言进行更多的测试,因为JUnit只报告测试方法中的第一个断言失败。有一种方法,如果你打破了x=5的情况,你就没有办法知道是否有x!=5个案例仍然有效。

如果你正在为你的设置做大量的复制,你不应该为你的测试类使用
setup()
方法吗?更不用说,如果第一个断言失败,那么您不知道其他断言是否也有问题。我不是在jUnit中讨论setUp()函数,而是讨论测试用例描述测试情况的部分(创建模拟等)。我将更新答案以反映您的优点,即您不会看到其他断言是否失败。他在问是否应该为一个方法的不同输入/用例编写单独的测试方法,或者只是在一个测试方法中放置多个断言。这并不能真正回答这个问题,即使它本身就是一个很好的信息。这是一个很好的观点,我想我只是读他的问题有点不同。最终,分支通常针对不同的条件指定不同的行为,因此答案仍然是多个测试方法,每个测试方法测试一个行为。这似乎是传统智慧。但我也有过这样的情况,我更喜欢在一个测试方法中放置多个断言,因为否则测试类会变得臃肿而几乎没有收益。就像在测试
hashCode
equals
方法时一样。你通常会测试同样的东西,比如及物性和反身性,所以我并不在乎我是否只看到了第一次失败。一个错误的断言意味着方法是错误的,所以我会在其他断言之前修复它,而其他断言可能依赖于该断言。编写测试是一件麻烦的事,可以理解有人想让它变得更快。因为理解了我想知道的核心问题以及JUnit常见问题的链接而被接受。
void testMethod() {
// x is 5
test/assert code;

// x not 5, z not 2
test/assert code;

// x not 5, z is 2
test/assert code

// etc
}