2017-09-27 138 views
2

不單元測試意味着測試必須嘲笑或單元測試的定義可以是不嘲笑?單元測試是否意味着測試必須被模擬?

例如下面,此試驗是嘲笑,所以它是單元測試:下面

/** 
* @test 
*/ 
public function it_should_return_true_if_ssh_client_is_connected() 
{ 
    $this->phpSecLibShh->shouldReceive('isConnected')->andReturn(true)->once(); 

    $this->assertTrue($this->shell->connected($this->phpSecLibShh)); 
} 

實施例,是這樣的單元測試或集成測試?我不清楚這個:

/** 
* @test 
*/ 
public function it_should_get_half_price_discount() 
{ 
    $cost = 50; 

    $order = new Order(); 

    // It does not connect to database or any other service 
    $discounted = $order->discount(Order::DISCOUNT_HALF_PRICE, $cost); 

    $this->assertEquals(25, $discounted); 
} 

回答

2

嘲笑的主要思想是解耦依賴。單元測試不應該有任何的依賴。說你的業務邏輯連接到數據庫層,然後連接到數據庫。現在你正在編寫一個單元測試來測試你的業務邏輯。如果您不是將數據庫基礎層與業務邏輯分離開來,那麼您的單元測試將會發揮作用,並且不會發生這種情況。所以你應該做的是將數據庫依賴注入到業務邏輯層,並在編寫單元測試模擬該依賴時。

長話短說,你不必總是模擬單元測試,但如果任何依賴性那麼就應該被嘲笑。如果您的測試有任何依賴性(比如數據庫的依賴,文件相關性等),則無法進行測試單元測試,但集成測試

+0

不按照Martin Fowler的(https://martinfowler.com/bliki/UnitTest.html)... [單元測試的定義,對於他(和Kent Beck,JUnit和TDD的創造者),在單元測試被測試的單元不一定必須與其依賴關係隔離。就個人而言,我認爲孤立的單元測試通常是一個壞主意,應該避免。 –

+0

@Rogério我很欣賞你的評論。單元測試是我們運行了很多次的東西。如果我們更改事件一行代碼,我們可以運行單元測試,以確保更改不會影響到目前爲止編寫的任何功能邏輯。現在認爲,在您的業務邏輯中,您正在調用外部付費Web服務的業務邏輯。如果你不嘲笑那項服務,那麼你每次運行單元測試都會付錢。我同意測試應該被隔離,但它也應該與依賴隔離。隔離意味着一個代碼單元。 –

+0

當然,如Fowler的文章中提到的那樣,當調用「笨拙的合作者(如遠程信用卡驗證系統)」時,確實有意義進行模擬。但是,這種情況應該是例外而不是常態,而且在大多數現實世界的代碼庫中都非常罕見。嘲笑圖書館的問題是沒有經驗的開發人員往往會濫用它們(以及濫用它們,因爲它們固有的複雜性)。我從開發一個嘲笑圖書館12年的經驗中瞭解到這一點,同時支持用戶,並看到他們經常犯的錯誤。 –

1

維傑,從我的經驗,球隊將是最好的法官來決定他們是否需要一個孤獨的/社交/自適應單元測試策略,因爲沒有「一刀切」的解決方案。

話雖如此,我相信是適應性可能更實用。幾乎所有的中大型單片應用程序都將具有至少一種外部依賴性,這在開發/測試環境中可能不可用(例如:支付網關/決策引擎)。模擬數據將是我們唯一的選擇。然而,在相同的單元測試案例中,我們也可以組織另一個社交場景(通過在同一個類/名稱空間中調用另一個函數)。第二個函數甚至有可能在單獨的模擬測試用例上有它。因此,它可以成爲一種適應性的單元測試策略,其中團隊根據他們所稱的單元採取集體立場,並根據情景基礎在場景中使用何種策略。 我們也應該記住,當我們開始構建部署管道時,我們的單元測試用例可以作爲自動化過程的一部分執行,而自動化過程本身就是供應環境的一部分。因此,將我們的單元測試用例與任何數據庫/文件依賴關係隔離起來可能是有益的。

在未來,當越來越多的應用到移動微服務架構和集裝箱化運輸,我們將有各地的單元測試策略更加清晰使用。開發/部署將在無狀態和可獨立部署/管理的塊中完成。像Docker Daemon API這樣的工具可以用來啓動一個託管特定相關/依賴服務/功能的容器,並將其作爲我們測試用例執行的一部分運行,這樣可以防止我們嘲笑其他服務,因爲我們可以輕鬆激活具有相關服務的輕量級容器並對其進行測試。

相關問題