技术开发 频道

使用Visual Studio进行单元测试

    要继续我们的过程,请执行以下操作:

    ? 基于您选择的语言选择 Create a new {0} Test Project。
 
    最后,该对话框提供通过 Settings 按钮(位于左下角)自定义代码生成过程的功能。单击该按钮将加载 Test Generation Settings 对话框,如图 7 所示。

    

    图 7. Test Generation Settings 对话框

    该对话框允许您进行以下更改:

    ? 更改命名约定,它们用于生成针对文件、类(测试装置)和方法(测试)的名称。
 
    ? 打开/关闭使所有测试结果在默认情况下为 Inconclusive 的功能。选择该选项将在每个生成的 Test() 方法中包含以下占位符语句。

    Assert.Inconclusive("TODO: Implement code to verify target");

 
    ? 打开/关闭启用生成警告的功能 — 即,如果在代码生成过程中出现任何警告,都要进行报告。
 
    ? 在全局范围内限制所有类型。该设置通知代码生成引擎将一个全局限定符(在 Microsoft Visual C# 2005 中是 global::)添加到变量声明中。当在多个命名空间中具有名称相似的对象时,请使用该设置。否则,代码生成引擎将创建逻辑来创建该对象,但是编译器不能确定创建哪个类,因此会产生错误。
 
    ? 启用/禁用针对已具有测试的项生成测试的功能。下面我们将讨论关于后续代码生成尝试的主题。
 
    ? 启用/禁用文档注释。这允许您在使用每个 Test() 方法时禁用 XML 文档的创建
 
    要完成我们的配置并生成单元测试代码(以及更多),请执行以下操作:

    1.单击 OK 按钮开始代码生成过程。
 
    2.输入名称 BankAccountDemo.Business.Test 作为新项目名,并单击 Create 按钮完成该过程。
 

    VS 2005 将显示一个进度栏,提供代码生成过程中的状态。该过程将在几秒钟内完成,您可以看到一个名为 BankAccountTest.cs 的类。

 
    生成了什么?
    在我们对该测试装置进行特别查看之前,让我们看一下在代码生成过程中创建了什么。

    首先,它创建了 Test Class Library 项目 BankAccountDemo.Business.Test。请注意该项目如何包含对实现类 BankAccountDemo.Business(您从其中生成代码)和 Microsoft.VisualStudio.QualityTools.UnitTestFramework 类库的引用。在查看该类的内容时,您将注意到以下文件:

    ? AuthoringTests.txt — 这是一些信息性的内容,定义如何使用单元测试(打开、查看、运行、查看结果、更改测试的运行方式),以及 VSTS 中包含的不同测试类型的定义。
 
    ? ManualTest1.mht — 这是 VSTS 中使用的手动测试套件,用于执行测试并报告结果。手动测试是 VSTS 支持的一个附加测试类型。有关更多信息,请参阅 MSDN 资源库的“手动测试”主题。
 
    ? UnitTest1.cs — 这是一个引用类,它只提供一个基单元测试(包括 TestClass、TestInitialize、TestCleanup 和 TestMethod 的定义)。
 
    ? BankAccountTest.cs — 这是特定于程序集生成的单元测试代码。让我们仔细看看该代码,它是代码生成过程中最重要的部分。
 

    由 Unit Testing 引擎生成的类包括以下组件:

    ? Using/imports 语句,用于引用的程序集。
 
    ? TestClass() 定义,用于包含该测试的类 (BankAccountTestFixture)。
 
    ? 一个私有访问器和用于 TestContext 的公共属性。它由单元测试运行器(即 VSTS Unit Test Framework)使用,以便提供关于当前测试运行的信息以及用于该运行的功能。
 
    ? TestInitialize() 和 TestCleanup() 方法。这些方法常用于获取和释放测试所需的任何对象。
 
    ? TestMethod(),用于每个选定的方法。
 

    让我们仔细看一下 DepositMoneyTest(),它负责确保当前的平衡能反映原始数量与累计数量的总和。

///
///A test case for DepositMoney (float)
///
[TestMethod()]
public void DepositMoneyTest()
{
float initialBalance = 0; // TODO: Initialize to an appropriate value
BankAccount target = new BankAccount(initialBalance);
float depositAmt = 0; // TODO: Initialize to an appropriate value
target.DepositMoney(depositAmt);
Assert.Inconclusive("A method that does not return a value" +
   "cannot be verified.");
}

    请注意该生成引擎除创建一个 stub TestMethod() 对象外,是如何进行其他操作的。它创建了适用于接口的示例单元测试,包括:

    ? BankAccount 对象的分配和结构(测试的对象主题)
 
    ? 本地变量的创建和默认分配,这些变量表示作为该测试主题的方法/构造函数所需的参数。

    ? TODO 注释,提醒开发人员适当地分配参数变量。
 
 
    ? 如果测试基于一个源对象方法调用,则生成的代码将包含对该方法(带有用于这些参数的局部变量)的调用。
 
    ? 初始 Assert() 方法调用,基于该方法的返回值。
 
    ? Assert.Inconclusive() 方法调用,作为完成测试代码的提示程序。非确定性测试将在 Test Results 对话框中显示为失败。 

0
相关文章