2017-02-22 87 views
1

我是BDD的新手,甚至是整個測試世界。我應該如何測試BDD中值對象類型的「isEqual」方法?

我想在快速編寫一個簡單的線性代數庫時採取BDD的做法。所以會有很多的值對象類型,如MatrixVector等在編寫代碼時,我想我還需要堅持TDD原則(是嗎?):

不寫代碼的任何一行,而不一個失敗的測試

要實現一個值對象類型,我需要使其符合Equatable協議並執行其==運營商。這是添加代碼,所以我需要一個失敗的測試。如何爲這種情況編寫規範?

一個可以建議像一些方法:

describe("Matrix") { 
    it("should be value object") { 
     let aMatrix = Matrix<Double>(rows: 3, cols:2) 
     let sameMatrix = Matrix<Double>(rows: 3, cols:2) 
     expect(sameMatrix) == aMatrix 
     let differentMatrix = Matrix<Double>(rows: 4, cols: 2) 
     expect(differentMatrix) != aMatrix 
    } 
} 

這將是兩個原因一個醜陋的樣板:

  1. 可能有大量的值對象類型的,我需要重複所有其中
  2. 可能有很多情況會導致兩個對象不相等。以上述規格爲例,==的執行如return lhs.rows == rhs.rows將通過測試。爲了揭示這個「bug」,我需要增加一個像expect(matrixWithDifferentColmunCount) != aMatrix這樣的期望。再次,這種重複發生在所有值對象類型上。

那麼,我該如何優雅地測試這個「isEqual」(或operator==)方法呢?或者我不應該測試它?


我正在使用swift和Quick進行測試框架。 Quick提供了一種稱爲SharedExample的機制來減少樣板。但是由於swift是一種靜態類型語言,Quick的共享示例不支持泛型,所以我不能直接使用共享示例來測試值對象。

我想出了一個workaround但不認爲它是一個優雅的。

回答

1

優雅是測試套件的敵人。測試套件很無聊。測試套件是重複的。測試套件不是「幹」。您製作測試套件越聰明,試圖避免模板化的越多,測試測試基礎架構的代碼就越多,而不是您的代碼。

BDD的規則是在編寫代碼之前編寫測試。這是少量的測試代碼,因爲它正在測試少量的實時代碼;你只是寫它。

是的,這可以採取太多,我不是說你從來沒有使用助手功能。但是當你發現自己重構你的測試套件時,你需要問自己測試套件的用途。

作爲一個便箋,您的測試不會測試它說的是什麼。您正在測試相同的構造函數創建Equal對象和不相同的構造函數創建非Equal對象(原則上這是兩個測試)。這根本不測試它是一個值對象(儘管這是一個非常好的測試)。這不是一個大問題。不要讓測試理念妨礙有用的測試;但讓你的標題符合你的測試意圖是很好的。

+0

這是真的(可悲)。 –

相關問題