2015-05-05 243 views
0

順序我如何控制我這個JUnit測試類在JUnit測試運行

public class TestRaavareBatch { 

    @Before 
    public void prep(){ 
     try { new Connector(); } 
     catch (InstantiationException e) { e.printStackTrace(); } 
     catch (IllegalAccessException e) { e.printStackTrace(); } 
     catch (ClassNotFoundException e) { e.printStackTrace(); } 
     catch (SQLException e) { e.printStackTrace(); } 
    } 

    MySQLRaavareBatchDAO rvb = new MySQLRaavareBatchDAO(); 

    @Test 
    public void testgetRaavareBatch() throws DALException{ 
     RaavareBatchDTO rvbOBJ = rvb.getRaavareBatch(7); 
     assertEquals(7, rvbOBJ.getRaavareId()); 
     assertEquals(100.0, rvbOBJ.getMaengde(),0.0); 
     assertEquals(7, rvbOBJ.getRbId()); 
    } 
    @Test 
    public void testgetRaavareBatchList() throws DALException{ 
     List<RaavareBatchDTO> rvbOBJ = rvb.getRaavareBatchList(); 
     assertEquals(rvbOBJ.size(), 8); 
    } 
    @Test 
    public void testgetRaavareBatchListId() throws DALException{ 
     List<RaavareBatchDTO> rvbOBJ = rvb.getRaavareBatchList(5); 
     assertEquals(rvbOBJ.size(), 2); 
    } 
    @Test 
    public void testcreateRaavareBatch() throws DALException{ 
     RaavareBatchDTO test; 
     rvb.createRaavareBatch(test = new RaavareBatchDTO(8, 8, 200.0)); 
     RaavareBatchDTO rvbOBJ = rvb.getRaavareBatch(8); 
     assertEquals(8, rvbOBJ.getRbId()); 
     assertEquals(200.0, rvbOBJ.getMaengde(),0.0); 
     assertEquals(8, rvbOBJ.getRbId()); 
    } 
    @Test 
    public void testupdateRaavareBatch() throws DALException{ 
     RaavareBatchDTO test; 
     rvb.updateRaavareBatch(test = new RaavareBatchDTO(8, 7, 100.0)); 
     RaavareBatchDTO rvbOBJ = rvb.getRaavareBatch(8); 
     assertEquals(7, rvbOBJ.getRaavareId()); 
     assertEquals(100.0, rvbOBJ.getMaengde(),0.0); 
    } 
} 

它連接到7行的數據庫,以後我運行最後一次測試「updateRaavareBatch」我創建了一個新行,所以在testgetRaavareBatchList()列表的大小將爲8.但它給了我一個錯誤,因爲它在我創建一個新行之前計算大小.. 我如何在創建新行並更新它之後運行testgetRaavareBatchList()

+1

沒有。如果我沒有弄錯,每次測試後都會有回滾。如果你想驗證一個額外的行是在數據庫中,你需要把插入與檢查額外的行相同的測試。 – Stultuske

+11

如果你的測試互相干擾,你應該修正它,使它們不會相互干擾,而不是僅僅試圖控制順序。 –

+0

它不是偶爾被稱爲*單元*測試。如果某些測試依賴於其他測試,請將它們加入一個'@ Test'。 –

回答

3

我曾經在測試數據庫中的查詢,插入和刪除時得到類似的東西。

我用下面的紅外線,以確保測試獨立性結束:

  • 準備
  • 回滾@After
  • @Before方法數據庫連接把一些插入私下不@Test註解的實用方法以避免重複
  • 需要時@Test方法稱爲效用方法,並做了他們的工作與斷言

在另一個困難的情況下,我在@BeforeClass方法創建一個嵌入式數據庫和@AfterClass

摧毀,但你應該永遠依靠測試程序。

1

您可以在您的測試課程上使用@FixedMethodOrder註釋。

一個簡單的例子如下:

進口org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters;

//Running test cases in order of method names in ascending order 
@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class OrderedTestCasesExecution { 
    @Test 
    public void secondTest() { 
     System.out.println("Executing second test"); 
    } 

    @Test 
    public void firstTest() { 
     System.out.println("Executing first test"); 
    } 

    @Test 
    public void thirdTest() { 
     System.out.println("Executing third test"); 
    } 
} 

Output: 

Executing first test 
Executing second test 
Executing third test 

雖然只是關於您的特定測試場景的一件事。在您的情況下,最好有適當的@Before@After方法來設置和回滾數據庫測試。稍後,如果您的代碼庫足夠大,可能會遇到一個測試無法正確清理並導致另一個隨機測試失敗的情況。

參考文獻:

Simple TestCase source

JUnit Javadoc for the @FixMethodOrder

Another decent page on JUnit