2011-10-06 69 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的军团:)