2013-06-20 46 views
1

我有兩個班,親子:取決於遺傳測試

class Parent 
{ 
    public function parentAction() {...} 
} 

class Child extends Parent 
{ 
    public function childAction() {...} 
} 

現在我使用PHPUnit進行測試這些。 (我不是真正的單元測試,但對這個問題的目的,我想你可以認爲我是我做這與這些測試類:

abstract class ParentBaseTest extends PHPUnit_Framework_TestCase 
{ 
    public function testParentAction() {...} 

    protected function factoryMethod() 
    { 
     return new Parent(); 
    } 
} 

class ParentTest extends ParentBaseTest 
{ 
} 

class ChildTest extends ParentBaseTest 
{ 
    protected function factoryMethod() 
    { 
     return new Child(); 
    } 

    public function testChildAction() {...} 
} 

背後這裏使用繼承與想法factoryMethod是在不重寫Parent的測試的情況下,ParentBaseTest的測試也會在Child上運行,換句話說,測試是Child是否正確地遵守Liskov的替代原則。使用抽象基類和空的繼承類是必要的,因爲PHPUnit不想運行你的基類測試兩次否則。

以上所有的作品。但是,現在我想添加一個依賴testParentAction()testChildAction()(即在testChildAction()定義之前添加/** @depends testParentAction */)。

這不起作用。由於PHPUnit不會改變運行測試以滿足依賴性的順序,並在運行測試之前運行ChildTest中定義的測試,所以它將繼續從ParentTest繼承,它總是會導致跳過testChildMethod()

是否有可能強制PHPUnit先運行繼承的測試?或者是否有另一種(乾淨)的方式來強制依賴?

回答

1

我認爲這裏對單元測試存在誤解。雖然你的面向對象的理論是準確的,但它不適用於單元測試的領域,讓我解釋我的觀點。

每個測試用例類都應該測試給定類的所有行爲,並且該類內的每個測試用例應該測試被測試類中每個方法的一小部分。這意味着在測試類中有一個工廠方法是沒有意義的,因爲它不應該改變或接收不同的實例來測試,或者它將測試該類的錯誤事件。在設置中,您可以實例化共享夾具,並且Child或Parent類在它們各自的測試類的所有測試用例之間共享。

另外單元測試用例應該是獨立運行的,所以你可以自由地運行一個給定的測試用例,它應該通過,並且其他測試用例不應該依賴這個結果來通過或失敗,否則你將會有一個隨機行爲你的測試從來不是一件好事。因此,兒童測試不應該取決於父母的測試,家長不應該依賴於孩子的測試(即使在OOP中,父母的班級也應該無知其孩子)。

此外測試用例可以以不同的順序運行,這不應該影響測試的正確性,因爲正如我所說的,每個測試用例都應該能夠運行隔離。

如果你想了解更多關於如何做好單元測試的內容,我強烈推薦這本書:http://www.amazon.com/Effective-Unit-Testing-guide-Developers/dp/1935182579/ref=sr_1_3?ie=UTF8&qid=1372014749&sr=8-3&keywords=unit+testing它是針對java開發者的,但理論是在所有框架之間共享的,它們有全部的測試氣味和如何修復他們並阻止他們。

+0

@Jasper:我認爲你誤讀了markdrake,並且你誤解了更基本的東西:這裏沒有人需要向你解釋任何東西。我會說這種不同的說法,你不能理解答案。所以它不太關於理想世界或不那麼理想的世界,但更多的是關於已經回答的問題:兩個單元測試都需要單獨測試這兩種類型。期。運行隔離的測試來測試這些對象。如果這兩種類型之間存在隱藏的依賴關係,請修復該問題。這就是你測試的原因。 – hakre

+0

@hakre你對我的措辭和語調絕對正確。我會重新評論我的評論。 – Jasper

+0

正如我所看到的,遵循Liskov替換原則,您應該能夠運行您爲您的子類上的父類編寫的測試。你說爲此使用工廠方法是沒有意義的,但是我不明白工廠方法會如何導致測試錯誤的東西。我也不明白爲什麼測試之間不能有依賴關係。當您測試使用您正在測試的功能的某些內容時,如果對使用的功能的原始測試失敗,則標記此測試將跳過,這意味着您可以更好地查明代碼中的問題。 – Jasper