如何测试java个软件?

How to test a java software?

我们被分配了一个开源软件来测试! 该软件有3个包,每个包有10个或更多class,每个class可能有几十种方法。

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

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

我应该采取什么方法?

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

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

如果您没有规格或最近的趋势 'UserStories' 您需要 'reverse engineer your specs' :) 您需要分析每种方法以了解它在做什么,接下来您将检查在哪里调用这些方法是为了弄清楚在方法调用中传递的可能值是什么。同样从调用方法中,您可能会了解什么是极端情况。以及您绝对想测试的那些。

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

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

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

例如

假设我们有一个方法可以对两个必须等于或大于 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,是否 return 65?
  • 如果 a = -3 且 b = 4,是否抛出异常?
  • 如果 a = 5 且 b = -13,是否抛出异常?
  • 如果 a = -46 和 b = -13,它会抛出异常吗?
  • 如果 a = 0 且 b = 0,是否 return 0?
  • 如果 a = -1 且 b = -1,是否抛出异常?

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

有几种类型的测试。

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

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

  • Code coverage。如果没有代码覆盖率指标,我们将生活在洞穴中。
  • Fault injection 帮助您构建更健壮和稳定的软件。
  • mocking usage 编写更具体的测试,而不会对应用程序的其余部分产生肮脏的影响。