2013-12-08 60 views
1

讓說我的單元測試,返回汽車的數量在我的車庫的方法,所以我有這樣的方法:我應該在單元測試中做多少對象初始化?

public class Garage { 
    public long numberOfCarsInGarage() { 
     return cars.size(); 
    } 
} 

從測試類:

@Test 
public void numberOfCarsInGarage_returnsCount_whenCarsHaveBeenAddedToTheGarage() { 
    Garage garage = new Garage(); 

    Car firstCar = new Car(); 
    Car secondCar = new Car(); 
    Car thirdCar = new Car(); 

    garage.addCars(firstCar, secondCar, thirdCar); 

    assertEquals(3, garage.numberOfCarsInGarage()); 
} 

每輛車對象有許多屬性需要設置,但我不需要設置它們以便測試通過。我是否應該在測試中儘可能少地使用代碼來使其通過/失敗?在這個測試中,我沒有在汽車對象上設置虛擬數據,我沒有做錯任何事情?

+1

您不需要設置不會導致測試失敗的字段。我會盡最大努力通過測試。理想情況下,你會做的最低首先失敗,然後添加代碼,使其通過。 –

+0

調用'garage.addCars(...);'的已知副作用是什麼?這就是你的測試應該涵蓋的內容。 –

+0

我同意上述兩點意見。我的建議:寫下待測試方法的javadoc,並驗證在此javadoc中聲明的合同是否已完成。如果合同是「返回車庫中的汽車總數」,那麼它應該測試。如果合同是「返回車庫中紅色車輛的數量」,那麼它應該添加一些紅色車輛和一些非紅色車輛,並對其進行測試。編寫javadoc不僅僅是因爲它記錄了方法,還因爲它讓你思考你需要測試什麼,邊緣情況等。 –

回答

0

對於您所描述的用例,似乎沒有設置虛擬數據。這真的取決於該項目。我正在測試每臺服務器上涉及5臺服務器和多個進程的複雜分佈式系統。我的一些測試處理小部分,但一些是整個系統的端到端測試。就我而言,我的大多數測試框架都在設置環境。一般的規則是,你應該設置足夠的,以便你的測試可能捕捉失敗。每當你發現你的測試用例沒有被捕獲,因爲它沒有足夠的設置,考慮設置更多的東西,這樣測試用例將在未來捕獲它。請注意,您正試圖平衡涵蓋可能出現的問題的測試用例,並使它們足夠簡單,以便您可以高效地編寫它們。

0

如果你正在進行單元測試numberOfCarsInGarage()這意味着你只希望你的測試只有在該方法中的某些內容出錯時纔會失敗,那麼你應該嘗試將它的調用與類中的其他內容隔離開來。

我建議避免調用addCars(),而不是我會創建一個模擬汽車列表,我會set it in the SUT using reflection

相關問題