单元测试
单元测试对于开发者来说,尤其重要,如果开发者接受TDD的方式,那么单元测试将成为不可或缺的一部分,尽管要测试的“单元”(此处的单元包括类型、方法等)的大小各异,但VSTS测试工具 会生成专门针对方法(包括私有方法)的单元测试。
单元测试用于通过直接调用某个类的方法(传递相应参数)来执行其他源代码。因此,如果包括Assert语句,它们可以根据所期望的值来测试实际生成的值,单元测试方法位于测试类中,测试类存储在源代码文件中。
可以使用能够创建测试的初始源代码的代码生成功能来创建单元测试,也可以完全手动编写测试。无论使用何种方式,测试类和所有测试方法都用编程属性加以标识。如使用[TestClass()]特性标记每个测试类,每个单元测试都是一个使用[TestMethod()]特性标记的测试方法。这些属性是在生成单元测试时自动分配的;如果是手动编写单元测试代码,则必须自行添加类和方法的属性。
在文件组织结构上,我们习惯于对于测试项目通过“项目名” + “Test”字符表示,而对于每个测试类,习惯于为它们加上后缀Fixture,这也是微软推荐的方式。
下面是一段来自于微软模式与实践团队中Unity项目的测试代码:
[TestMethod]
public void ResolverWithElementsReturnsEmptyArrayIfThereAreNoElements()
{
IUnityContainer container = new UnityContainer();
object o1 = new object();
object o2 = new object();
object o3 = new object();
container
.RegisterInstance<object>("o1", o1)
.RegisterInstance<object>("o2", o2);
BuilderContext context = GetContext(container, typeof(object));
ResolvedArrayWithElementsResolverPolicy resolver
= new ResolvedArrayWithElementsResolverPolicy(typeof(object));
object[] results = (object[])resolver.Resolve(context);
Assert.IsNotNull(results);
Assert.AreEqual(0, results.Length);
}
public void ResolverWithElementsReturnsEmptyArrayIfThereAreNoElements()
{
IUnityContainer container = new UnityContainer();
object o1 = new object();
object o2 = new object();
object o3 = new object();
container
.RegisterInstance<object>("o1", o1)
.RegisterInstance<object>("o2", o2);
BuilderContext context = GetContext(container, typeof(object));
ResolvedArrayWithElementsResolverPolicy resolver
= new ResolvedArrayWithElementsResolverPolicy(typeof(object));
object[] results = (object[])resolver.Resolve(context);
Assert.IsNotNull(results);
Assert.AreEqual(0, results.Length);
}
在VSTS中所有的测试操作都可以通过“测试”菜单下的命令完成,如图8所示:

图8
可以新建测试,或者在这里运行测试,或者对整个解决方案运行单元测试。