2011-12-15 235 views
2

我使用junit和eclipse編寫函數測試。Selenium junit測試 - 我如何按順序在測試中運行測試?

運行單個測試時,它按照我在課堂上設置的順序運行。

例如,

testCreateUser 
testJoinUserToRoom 
testVerify 
testDeleteUser 

然而,當我運行該測試作爲套件的一部分,(因此在一個包中)的順序是隨機的。

它將例如進行驗證,然後刪除用戶,然後加入userToRoom,然後刪除用戶。

我在套件中的測試不相互依賴。然而,測試中的每個單獨測試都依賴於它們以正確的順序運行。

有什麼辦法可以實現這個目標嗎?

謝謝。

回答

6

你補充不能保證在JUnit中執行測試方法的順序。

測試的執行的一套保證(如果你使用Suite)內的順序,但執行的順序,如果測試類是通過反射發現不是(舉例來說,如果你在Eclipse中運行一個包,或者從maven或ant運行一組測試)。這可以由ant或maven來定義,但它並不是由JUnit定義的。

一般而言,JUnit的執行順序的測試方法在它們被在源文件中所定義,但不是所有的JVM保證這一點(格外與JVM 7)。如果某些方法是從抽象基礎測試類繼承的,那麼這可能不適用。 (這聽起來像你的情況,但我不能從你的描述中知道)。

欲瞭解更多信息,請參閱我的回答Has JUnit4 begun supporting ordering of test? Is it intentional?

那麼你能做些什麼來解決你的問題?有兩種解決方案。在你原來的例子中,你實際上只有一個測試(驗證),但你有4個方法,兩個設置(createUser,joinUserToRoom)和一個拆卸(deleteUser)。所以你的第一個選擇是更好地定義你的測試用例,使用TestRule,特別是ExternalResourceExternalResource允許您定義測試的前/後行爲,類似於@Before/@After。但是,ExternalResource的優勢在於,您可以將這個因素排除在測試之外。

所以,你需要創建/刪除用戶在外部資源:

public class UsesExternalResource { 
    @Rule 
    public ExternalResource resource= new ExternalResource() { 
     @Override 
     protected void before() throws Throwable { 
      // create user 
     }; 

     @Override 
     protected void after() { 
      // destroy user 
     }; 
    }; 

    @Test 
    public void testJoinUserToRoom() { 
     // join user to room 
     // verify all ok 
    } 
} 

對於我來說,這是更簡單,更容易理解,你會得到獨立的測試,這是一件好事。這是我會做的,但是你需要重構你的測試。您也可以使用RuleChain來堆疊這些規則。

如果您真的想介紹測試方法之間的依賴關係,您的第二個選擇是查看TestNG,您可以在其中定義從一個測試到另一個測試的依賴關係。

0

如果他們有一個「正確」的順序,那麼他們是不是多重考驗,但一個測試,你錯誤地標註爲是多個獨立測試。

最佳做法是重寫他們的junit批准風格(設置 - 行爲 - 驗證),由@Before或做任何需要的常用設置@BeforeClass方法支持。

快速解決方法是按順序調用其他測試方法的單個@ Test-annotated方法。如果您使用Junit不是進行嚴格的單元測試,而是更像情景驅動的系統測試,那麼這將成爲首選替代方案。這不一定是這種使用的最佳工具,但在某些情況下它確實工作得很好。

那麼,你就必須到目前爲止是有一個單一的測試:

@Test public void testUserNominalLifeCycle(... 

可能的話,如果你感覺賢惠,可以通過額外的新的測試,如

@Test public void testUserWhoNeverJoinsARoom(... 
+0

感謝Soru,包內的測試可以按任意順序運行。但是這些測試中的測試需要按正確的順序運行。所以它必須以admin身份登錄創建一個用戶並將該用戶加入到一個房間。然後以該用戶身份登錄並運行測試。我不確定如何在沒有任何依賴的情況下運行這種測試......? – 2011-12-15 10:41:07

+0

對於單元式測試,您可以擁有創建所需用戶的@Before(或@BeforeClass)以及用於清理它們的相應註釋後的函數。 – soru 2011-12-15 12:09:37

相關問題