2011-10-06 61 views
0

我有通過序列化XML文件進行初始化的對象。包含XML作爲單元測試的嵌入式資源?

我在考慮將測試數據作爲嵌入式資源包含在測試項目中,而不是在測試方法本身中對數據進行「硬編碼」。

嵌入式硬編碼方式:

[Test] 
public void IsMale_CheckIfGenderIsMale_ReturnsTrue() 
{ 
Human human = new Human(); 
human.Gender = Gender.Male; 
Gender expected = Gender.Male; 
Assert.IsTrue((human.Gender == expected)); 
} 

XML的方法:

[Test] 
public void IsMale_CheckIfGenderIsMale_ReturnsTrue() 
{ 
Human human = Human.Initialize("Human_Male.xml"); 
Gender expected = Gender.Male; 
Assert.IsTrue((human.Gender == expected)); 
} 

這是一個更好的辦法?

回答

0

我們經常使用嵌入的XML文件,在我們的測試項目。因爲我們想用xml來測試對象的創建。

這也是很好的做法從類本身分離對象的創建,例如:

Human human = HumanFactory.Create("Human_Male.xml"); 

人的類會再有一個構造函數需要參數,如性別,並且可以被稱爲來自HumanFactory類。這是一個分離的問題,可以讓你的課程的邏輯與構建它的機制分開。

而當您需要一個人體對象進行測試時,您可以選擇直接創建它或使用工廠並從xml創建它。

我還將通過給它一個xml字符串(或流)而不是文件名來簡化HumanFactory類。這可以使其更容易測試 - 因爲你可以在您的測試代碼,而不是在一個文件中的XML:

Human human = HumanFactory.Create("<human gender="m"></human>"); 
Assert.AreEqual(human.Gender, Gender.Male); 

否則,你的測試依賴於兩種:

  1. 測試設置代碼部署將「Human_Male.xml」文件添加到文件系統,然後將其刪除。雖然Visual Studio測試有一個很好的機制來做到這一點(測試設置部署將作爲測試運行設置的一部分將文件複製到測試運行文件夾中)。
  2. 在測試代碼中包含嵌入資源的路徑。如果您應該重構您的項目佈局,您將需要更改測試代碼以匹配。並確保您使用相對路徑。
0

外部文件的唯一問題是它們可能會更改。

我的首選選項是在測試文件中有一系列初始化函數,可以在需要時從測試方法調用。這也可以使其他人可以更輕鬆,更快地閱讀代碼,甚至可以在六個月內收到代碼。

另一種選擇是將一些對象類基於接口/抽象類型,以便通過創建測試類來模擬它們(即使在運行時代碼中)。 例如(代碼無關):

抽象基類/接口:IHuman IHuman.Gender 屬性/屬性IHuman.Height屬性/屬性IHuman.Weight 屬性/屬性

類繼承HumanMale IHuman HumanMale .Gender重寫IHuman 性別將返回男性。

class HumanFemale inherits IHuman HumanFemale.Gender overrides IHuman 性別女性。然後

所有代碼使用IHuman,你甚至可以使用一個工廠來創建IHuman類型來創建Cyber​​men的軍團:)