你補充不能保證在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,特別是ExternalResource。 ExternalResource
允許您定義測試的前/後行爲,類似於@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,您可以在其中定義從一個測試到另一個測試的依賴關係。
感謝Soru,包內的測試可以按任意順序運行。但是這些測試中的測試需要按正確的順序運行。所以它必須以admin身份登錄創建一個用戶並將該用戶加入到一個房間。然後以該用戶身份登錄並運行測試。我不確定如何在沒有任何依賴的情況下運行這種測試......? – 2011-12-15 10:41:07
對於單元式測試,您可以擁有創建所需用戶的@Before(或@BeforeClass)以及用於清理它們的相應註釋後的函數。 – soru 2011-12-15 12:09:37