我在閱讀Clean Code: A Handbook of Agile Software Craftsmanship
,其中一個示例涉及Portfolio
類和TokyoStockExchange
類。然而,Portfolio
不是很好測試,因爲它取決於TokyoStockExchange
作爲一個外部API來確定投資組合的價值,這是一個相當不穩定的查找,不利於測試。混淆爲什麼它對單元測試虛擬對象有用
因此,他們通過創建一個通用的StockExchange
接口來解決這個問題,並且TokyoStockExchange
和DummyStockExchange
都實現了基類。因此,依賴倒置原則已經實現,並且在類別中可以實例化一個DummyStockExchange
,將股票價格固定到公司,將該實例分配給該投資組合,並且將該公司的一些股票添加到該投資組合,然後斷言預期的價值確實是合適的價值。下面的代碼:
public class PortfolioTest
{
private DummyStockExchange exchange;
private Portfolio portfolio;
protected void setUp()
{
exchange = new DummyStockExchange();
exchange.fix("MSFT", 100);
portfolio = new Portfolio(exchange);
}
public void GivenFiveMSFTTotalShouldBe500()
{
portfolio.add(5, "MSFT");
Assert.assertEquals(500, portfolio.value());
}
}
我的問題,簡單地說,就是爲什麼?
我們試圖測試TokyoStockExchange
類是否與Portfolio
類一起工作。顯然,如果我們用一種設定股票價格的新方法創建另一個類別,然後給這些股票組合5個股票,那麼一切都將起作用。它似乎......無用測試。我知道TokyoStockExchange
基本上不可能通過Portfolio
進行測試,因爲股票價格不斷變化,但我不明白在相當無用的測試中如何消除這種情況。
這一切似乎不知道我們的加法器程序是否工作,但唯一可用的數字是隨機生成的,所以我們創建一個虛擬類,給我們一個2並測試如果2 + 2 = 4
。好吧,顯然這是真的。我們仍然可以打破TokyoStockExchange
,測試仍然會成功,因爲它正在測試另一個課程。如果有的話,這一切似乎都具有欺騙性,並且還導致不得不編寫額外的代碼來測試我們知道的工作。
我認爲這是我在理解單元測試時遇到的最大問題。我知道我錯了,我只是沒有看到我猜到的光。希望有人能幫助我。
僅供參考......如果您使用*'Portfolio測試'TokyoStockExchange'工程*,那麼您超出了單元測試的範圍。 「投資組合」和「東京股票交易所」是單位,單元測試旨在從儘可能多的其他單位(最好全部)中分別測試每個單位*。它們之間的交互是*集成測試*涵蓋的內容。 – cHao 2012-08-17 02:21:14
+1是爲了試圖理解價值,而不是用「維護代碼的更多工作」來吹掉單元測試。 – 2012-08-17 02:27:26
這對於[程序員.se]來說更是一個問題。 – 2012-08-17 03:15:36