2013-05-03 79 views
-1

据我所知,单元测试用于测试相关函数是否按预期工作。我想知道,这是通过只检查函数的返回值来完成的吗?单元测试用法

除此之外,还有不同的方式使用单元测试?如果是的话,你可以请你展示一下。

+0

你检查什么你可以 – 2013-05-03 06:33:57

回答

0

你可以检查你喜欢的任何东西。对于函数式语言来说,函数的返回值是唯一的指示器,你可能需要检查全局状态(使用高级语言)或对象状态(使用面向对象的语言),以确定测试已通过。

作为一个非常简单的(而且通常没有必要)例如:

void testSetTextSetsText() 
{ 
    Foo foo(); 
    foo.setText("bar"); 
    assertEqual("bar", foo.text()); 
} 

你不能真正测试以另一种方式void方法,其实。 技术上你在这里再次检查方法的返回值(text()),但大多数时候你想编写测试来验证外部观察者可见的状态,所以这已经足够了。

+0

完美,谢谢! – willsam 2013-05-03 06:37:36

+1

为什么“经常不需要”?是的,设置一个成员是微不足道的,但是在设计良好的代码中,大多数事情都是基于其他琐事构建的。但那意味着你只需要测试一些不重要的东西。大部分bug都隐藏在一些不正确的琐事中(比如你的memleak和'.'而不是' - >'access)。所以这个测试*是必要的。也许不会检查'setText'是否确实做了正确的事情,但要确保它不会被意外更改。 – 2013-05-03 06:43:49

+0

我不再测试微不足道的getter和setter,代码覆盖率被诅咒。这是不支持更好构造的语言的样板代码(例如,与C#相比,Java和C++)。当设置者*确实*做了其他事情而不仅仅是设置该值时*我肯定*想要测试它(当合同说“设置模型时也会创建新的选择模型”)。但只是为了将一个论点传播到一个领域?我真的不再需要这种需要了。 – Joey 2013-05-03 06:47:16

1

您(可以)不仅检查值,还检查行为。例如,使用Mock-object抛出预期异常或致电外部服务。

void testMethodThrows() 
{ 
    Foo f; 
    AssertThrows([&](){f.bar();}); 
} 

void testSendsEmail 
{ 
    Foo f; 
    EmailServiceMock email; 
    f.bar(email); 
    Assert(email.EmailWasSent()); 
} 
+0

啊,的确,我忘了那些。带回需要在JUnit 3中测试异常的不好记忆;-) – Joey 2013-05-03 06:50:24