2013-05-03 44 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