目前,我处于可以编写源代码单元测试的位置,我完全可以看到(我认为这意味着它被认为是白盒测试?)。所以,这不是测试驱动的开发。
阅读这篇文章(What is the difference between integration and unit tests?)澄清了很多关于这一切的目的是什么,但我对我目前的立场感到困惑。
我们说我的方法是这样的:
/* Some basic description on what doSomething() does */
public int doSomething(Var someVariable) {
int someInteger = [code does a bunch of stuff to get this];
someInteger = someOtherClassObject.doSomethingElse(someInteger);
return someInteger;
}
现在,我真的不知道doSomething()
应该做什么。文档还不足以真正告诉我基于someVariable
的int应该是什么,而且我对源代码不够熟悉,我自己也没有真正提出它。
但我确实有实现,所以我看一下这个方法,输入一些Var
作为输入,然后按照代码断言 将> 返回。
public void testDoSomething() {
ClassWithDoSomething object = new ClassWithDoSomething();
assertEquals([what it looks like it would return], object.doSomething(new Var([some input would go here]));
}
在某种程度上,我以某种方式模拟了doSomethingElse()调用和Var构造函数(以及其他需要的外部类依赖项)。
我不知道这是否是进行这些单元测试的正确方法。我想我应该按照自己的意愿隔离这个方法,但是我不知道我的断言在确定是否存在错误方面有多么有意义,因为我知道方法doSomething()
是什么应该在代码中做,以及如何去做,所以我写了我的断言来得到那个结果。
答案我已经详细解读了由于方法doSomething()
的隔离故障导致单元测试如何有益的答案。但是当它的单元测试失败时,除了doSomething()
的实现发生变化(这意味着单元测试的变化)之外?
这是一个不太了解源代码的问题/源代码没有足够好的文档记录,只能知道我应该得到什么输出?
如果[code does a bunch of stuff to get this]
实际上只是someVariable + 3
,其中someVariable是一个int,当我知道测试将通过时,它被认为是一个有意义的断言断言返回值为someVariable + 3
基于那个实现?
答案 0 :(得分:0)
但它的单位测试什么时候会失败?
你完全正确;当doSomething
的实施发生变化时,单元测试将失败。当一个看似无害的变化实际上破坏了方法时,单元测试的目的是抓住它。
单元测试通常类似于您发布的代码段:
public void testDoSomething() {
ClassWithDoSomething object = new ClassWithDoSomething();
object.someOtherClassObject = new MockOtherClass();
assertEquals(4, object.doSomething(new Var("Input that maps to 4"));
}
SomeOtherClass
和MockOtherClass
都会实现指定IOtherClass
的{{1}}接口。当您调用doSomethingElse
方法时,MockOtherClass
只会返回输入。
答案 1 :(得分:0)
我认为如果您不知道代码应该做什么,那么编写单元测试毫无意义。 单元测试是检查是否有一些输入代码行为正确。如果您不知道'正确'是什么意思,那么您如何测试呢?在编写有价值的测试之前,你必须先了解代码的意图。
如果您编写测试以便从头开始重写源代码,情况会有所不同。在这种情况下,测试是您可以获得的最佳安全网,因为它们记录了实际行为并保证不会发生变化。但即使在这种情况下,如果不知道代码的作用,很容易错过一些极端情况。
因此我建议在编写测试之前始终了解代码的用意。