我们已经分配了一个开源软件进行测试!该软件有3个包,每个包有10个或更多类,每个类可能有几十个方法。
我的问题是,在开始结构(白盒)测试之前,我是否需要了解软件中的每一行代码?
我是否需要了解从 main() 方法开始的整个程序流程?
我应该采取什么方法?
我们已经分配了一个开源软件进行测试!该软件有3个包,每个包有10个或更多类,每个类可能有几十个方法。
我的问题是,在开始结构(白盒)测试之前,我是否需要了解软件中的每一行代码?
我是否需要了解从 main() 方法开始的整个程序流程?
我应该采取什么方法?
如果您对每种方法应该做什么有规范:指定输入的预期输出是什么,那么您不需要进入这些方法的实现细节。通常应该写下来!
您可以编写单元测试来检查方法是否满足预定义的合同(如果它们存在)。
如果您没有规格或最近的趋势“用户故事”,您需要“逆向工程您的规格”:) 您需要分析每种方法以了解它在做什么,接下来您将检查这些方法在哪里被调用为了弄清楚在方法调用中传递的可能值是什么。同样从调用方法中,您可能会知道什么是极端情况。还有那些你肯定想测试的。
....慢慢地你学会了整个代码:)
不,您不必了解编写单元测试的每一行代码。我对单元测试还没有那么丰富的经验,但是到目前为止,如果看到的是测试每个(或大多数)对某个输入(--> 参数、对象变量...)响应不同的方法。
所以你必须知道一个方法做什么,什么时候成功,什么时候失败。对于某些方法,甚至这些案例之间的转折点也很重要。
例如
假设我们有一个将两个整数相加的方法,它们必须等于或大于 0:
public static int sumInts(int a, int b) {
if (a < 0 || b < 0) throw new IllegalArgumentException("'a' and 'b' should be 0 or above!");
return a + b;
}
你可以测试什么:
当然,这只是一个非常简单的例子。您测试的内容取决于您的方法。对于这种方法,最后两个测试可能完全不需要。但是有些方法更复杂,它们可能有用。
有几种类型的测试。
BigInteger fact(int n)
方法,你必须对正常的正整数、零、负整数和最大值/最小值编写测试。有几个库可以帮助您:JUnit、TestNG等。在经历了软件行业的黑暗时代之后,社区终于有了一些好的单元测试实践: