0

我们已经分配了一个开源软件进行测试!该软件有3个包,每个包有10个或更多类,每个类可能有几十个方法。

我的问题是,在开始结构(白盒)测试之前,我是否需要了解软件中的每一行代码?

我是否需要了解从 main() 方法开始的整个程序流程?

我应该采取什么方法?

4

3 回答 3

1

如果您对每种方法应该做什么有规范:指定输入的预期输出是什么,那么您不需要进入这些方法的实现细节。通常应该写下来!

您可以编写单元测试来检查方法是否满足预定义的合同(如果它们存在)。

如果您没有规格或最近的趋势“用户故事”,您需要“逆向工程您的规格”:) 您需要分析每种方法以了解它在做什么,接下来您将检查这些方法在哪里被调用为了弄清楚在方法调用中传递的可能值是什么。同样从调用方法中,您可能会知道什么是极端情况。还有那些你肯定想测试的。

....慢慢地你学会了整个代码:)

于 2015-12-01T21:49:42.877 回答
0

不,您不必了解编写单元测试的每一行代码。我对单元测试还没有那么丰富的经验,但是到目前为止,如果看到的是测试每个(或大多数)对某个输入(--> 参数、对象变量...)响应不同的方法。

所以你必须知道一个方法做什么,什么时候成功,什么时候失败。对于某些方法,甚至这些案例之间的转折点也很重要。

例如

假设我们有一个将两个整数相加的方法,它们必须等于或大于 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;
}

你可以测试什么:

  • 如果 a = 49 和 b = 16,它返回 65 吗?
  • 如果 a = -3 和 b = 4,它会抛出异常吗?
  • 如果 a = 5 且 b = -13,它会抛出异常吗?
  • 如果 a = -46 和 b = -13,它会抛出异常吗?
  • 如果 a = 0 且 b = 0,它是否返回 0?
  • 如果 a = -1 和 b = -1,它会抛出异常吗?

当然,这只是一个非常简单的例子。您测试的内容取决于您的方法。对于这种方法,最后两个测试可能完全不需要。但是有些方法更复杂,它们可能有用。

于 2015-12-01T21:59:02.480 回答
0

有几种类型的测试。

  • 单元测试在输入数据的不同情况下测试每种方法的功能。就像,如果你有一个BigInteger fact(int n)方法,你必须对正常的正整数、零、负整数和最大值/最小值编写测试。有几个库可以帮助您:JUnitTestNG等。
  • 集成测试将整个应用程序、所有包和类作为一个组进行测试。请参阅Arquillian 项目
  • 此外,您可以使用Selenium编写黑盒测试。
  • 更多类型的测试,如回归测试、负载测试等。这是 QA 工程师的工作。

在经历了软件行业的黑暗时代之后,社区终于有了一些好的单元测试实践:

  • 代码覆盖率。我们将生活在没有代码覆盖率指标的洞穴中。
  • 故障注入可帮助您构建更强大、更稳定的软件。
  • 广泛的模拟使用来编写更具体的测试,而不会对应用程序的其余部分产生肮脏的影响。
于 2015-12-01T22:18:48.480 回答