2012-03-12 115 views
13

我正在使用JUnit4。如何使JUnit測試用例按順序運行?

我在測試用例中有一組測試方法。

每個測試方法插入一些記錄並驗證測試結果,最後刪除插入的記錄。

由於JUnit並行運行,測試方法失敗,因爲在執行以前的測試方法期間存在一些 記錄。這 只發生在我的同事機器(Windows 7)中,而不是在我的機器上(Cent OS 6)。

我們需要的是測試方法必須通過我們所有的機器。

我已經嘗試清除Setup()方法中的記錄,但它只能在我的機器上運行。在JUnit中是否有任何選項使測試方法以統一的順序運行?

謝謝,

回答

5

在JUnit中無法保證測試的順序。

原因是單元測試的目的是原子 - 所有的設置應該在安裝/拆卸方法中進行,而不是其他測試。

考慮將插入數據的代碼移動到另一個可以由插入的測試和需要驗證的類調用的輔助類中,然後在@Before方法中調用該類。

如果可以的話,你還應該考慮一個模擬解決方案(例如Mockito),而不是直接敲擊數據庫 - 嘲笑會很長的一段時間,以確保你的測試是很好的和孤立的,作爲一個很好的副作用,通常有助於指出可以使用某些重構的地方。

+0

感謝您的回答,我會檢查出來。 – Athiruban 2012-03-13 08:39:20

+1

你也可以使用類似DBUnit的東西來控制你的數據庫設置和拆卸,但對於純粹的單元測試,Mockito更有意義,因爲它允許測試完全獨立。 – TrueDub 2012-03-14 08:39:50

2

由於您正在並行運行測試,並且您正在訪問數據庫,所以很可能會出現問題,因爲數據庫不一定處於每個測試的一致狀態。

解決方案:不要並行運行測試。 JUnit默認不會並行運行測試,所以無論是在maven中設置選項還是在JUnit中使用其中一個並行運行器。

如果您在Windows上的測試失敗但在Cent OS上沒有問題,那麼這可能是運行順序的問題,您需要修復它。看到我的回答Has JUnit4 begun supporting ordering of test? Is it intentional?

解決方法(至少在JUnit術語中)是移除測試之間的依賴關係。基本上,JUnit不支持排序,測試應該能夠以任何順序運行。

如果您確實需要在測試之間有依賴關係,請使用TestNG,您可以在其中擁有依賴關係。

21

MethodSorters是Junit 4.6發佈後推出的新類。這個類聲明瞭三種類型的執行順序,可以在你的測試用例執行時使用它們。

  1. NAME_ASCENDING(MethodSorters.NAME_ASCENDING) - 排序的測試方法 通過該方法名稱,在詞典順序。

  2. JVM(null) - 將測試方法留在由 JVM返回的順序中。請注意,來自JVM的順序因運行而異。

  3. DEFAULT(MethodSorter.DEFAULT) - 排序在 確定性的,但不是可預測的,順序的測試方法。

import 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"); 
    } 
} 

輸出:

Executing first test 
Executing second test 
Executing third test 

參考:http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/

-1

有並行運行測試,即使你有它的數據層沒有問題。但是您需要額外的工作來爲您的數據創建MOCK UP,以免它不會觸及數據庫。您可以使用不同的模型框架,如Mockito,EasyMock和Arquillian。

+0

Arquillian不是一個嘲諷的框架。請參閱http://arquillian.org/ – 2017-02-03 12:53:31

相關問題