创建并运行单元测试

转载:http://msdn.microsoft.com/zh-cn/library/ms182532(v=vs.80).aspx


此演练将逐步指导您使用 Team System testing tools 来创建、运行和自定义一系列测试。您将从正处于开发过程中的 C# 项目开始,创建执行该项目代码的测试,运行测试并检查结果。然后,可以更改项目代码并重新运行测试。

Note注意

有关如何从命令行运行测试的信息,请参见演练:使用命令行测试实用工具

在本演练中,您将完成以下任务:

  • 准备一个要在演练中使用的“银行帐户”项目。

  • 打开一个现有项目。

  • 为公共和私有方法创建单元测试。

  • 对代码运行这些测试。

  • 在测试中查找错误并进行更正。

  • 在代码中查找错误并进行更正。

准备演练

  1. 打开 Visual Studio 2005 Team Edition for Testers。

  2. 在“文件”菜单上指向“新建”,然后单击“项目”。

    随即出现“新建项目”对话框。

  3. 在“项目类型”之下单击“Visual C#”。

  4. 在“模板”之下单击“类库”。

  5. 在“名称”行中,键入 Bank,然后单击“确定”。

    Note注意

    如果名称“Bank”已被使用,请为该项目选择其他名称。

    新的 Bank 项目即被创建,并显示在解决方案资源管理器中。

  6. 在解决方案资源管理器中双击 Class1.cs 文件,以便在 Visual Studio 代码编辑器中打开它。

  7. 从 单元测试示例 中复制源代码。

  8. 用 单元测试示例 中的代码替换 Class1.cs 的原始内容。

  9. 在“生成”菜单上,单击“生成解决方案”。

现在您有一个名为“Bank”的项目。它包含要测试的源代码和用于对该源代码进行测试的工具。Bank 的命名空间“BankAccountNS”包含公共类“BankAccount”,在以下过程中将对该类的方法进行测试。

先决条件:按照准备演练过程中的步骤执行操作。

创建单元测试

  1. 在解决方案资源管理器中,双击 Bank 项目中的 Class1.cs 文件。

    这将打开要查看和编辑的源文件。

    Note注意

    Bank 项目包含要进行测试的代码,也称为“待测试代码”或 CUT。

  2. 在 Class1.cs 文件的“BankAccount”类中,滚动到“Debit()”方法。

  3. 右击“Debit()”方法,并选择“创建单元测试”。

    这将显示“创建单元测试”对话框。

    在“当前选择”下,树结构将显示保存“BankAccount”类的程序集的类和成员层次结构。使用此页可以为选定的任何成员生成单元测试,并可以选择要在其中放置生成的单元测试的测试项目。

    在该树结构中,只选择了“Debit()”方法。将其保留选定状态并选择“Credit()”方法。

  4. 对于“输出项目”,单击“创建新的 Visual C# 测试项目”。

  5. 单击“设置”。

    随即出现“测试生成设置”对话框。在“命名设置”下,可以更改测试文件、测试类和测试方法在生成时的命名方式。在“常规”下,可以更改测试生成的其他方面。将这些设置保留为默认值,然后单击“确定”。

  6. 在“生成单元测试”对话框中单击“确定”。

    随即出现“新建测试项目”对话框。

  7. 接受默认名称,然后单击“创建”。

    这将创建一个名为 TestProject1 的项目,该项目将显示在解决方案资源管理器中。

    为该测试项目添加一个名为 Class1Tests.cs 的文件,该文件包含一个测试类。该类由一个初始化方法、一个清理方法和一些用于测试“Debit()”和“Credit()”方法的方法来填充。

    Note注意

    将自动为每个测试方法分配“TestMethod()”属性。每个测试与要测试的 CUT 中的一个方法相对应。测试方法保存在已分配“TestClass()”属性的测试类中。

  8. 在 Class1Tests.cs 中,为要测试的变量指定值。滚动到“DebitTest”方法,在此可以看到指示要设置的变量(即“customerName”、“balance”和“amount”)的三个 // TODO 行。应使用什么值?若要回答此问题,必须知道应用程序运行时要使用的值。

  9. 在解决方案资源管理器中,双击 Class1.cs 文件将其打开,并滚动到“Main”方法。请注意,客户名称初始化为“Mr. Bryan Walton”,帐户余额初始化为“11.99”,调用“Credit”方法时使用参数“5.77”,调用“Debit”方法时使用参数“11.22”。因此,如果此帐户开始时“Balance”为“11.99”,在调用“Debit”方法时传递“11.22”应生成新“Balance”“0.77”。

    Note注意

    运行和自定义单元测试过程中,您将使用这一预期的“Balance”值 (0.77)。

  10. 打开 Class1Tests.cs 文件并滚动到“DebitTest”方法。

  11. 设置下列值:

    string customerName = "Mr. Bryan Walton";
    double balance = 11.99;
    double amount = 11.22;
    
  12. 保存 Class1Tests.cs 文件。

您已创建了一个源代码文件,其中包含 Bank 项目的测试。现在可以对 Bank 项目的代码运行“BankAccountTest”类中的测试了。

先决条件:执行创建单元测试过程中的步骤。

运行和自定义单元测试

  1. 使用“测试管理器”窗口或“测试视图”窗口运行 DebitTest 单元测试。

    如果“测试结果”窗口尚未打开,则它现在打开。“DebitTest”测试运行。

    在“测试结果”窗口的“结果”列中,当测试运行时,测试状态将显示为“正在运行”。测试运行完成后,测试的结果将更改为“没有结论”。

  2. 在“测试结果”窗口中双击表示测试的行。

    这将打开“测试结果详细信息”页,其中包含有关测试结果的信息。

  3. 请注意,“测试结果详细信息”页显示以下错误消息:“Assert.Inconclusive 失败。无法验证不返回值的方法。”若要创建成功的测试,请先查找并评估此“Assert”语句。

  4. 若要查找包含“Assert”语句的测试方法,请打开 Class1Tests.cs 文件并滚动到“DebitTest()”方法。

  5. Assert 语句是“DebitTest”方法中的最后一行。它显示如下内容:

    Assert.Inconclusive("A method that does not return a value cannot be verified.");
    

    注释掉此 Assert 语句。

  6. 如果现在运行测试,则会得出“已通过”结果,但这仅仅是因为它没有对任何内容进行测试。必须添加对预期的结果进行测试的代码。向“DebitTest”方法的末尾添加以下语句:

    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05);
    

    此语句将预期结果 (0.77) 与调用“BankAccount”类的“Balance”方法所产生的实际结果进行比较。如果两个值不相等,则“Assert”返回“False”,从而使测试失败。

    Note注意

    此“Assert”语句还包括第三个参数“delta”,其值为 0.05。在“Assert.AreEqual”方法的此重载中需要该 delta 参数;它可以补偿“Doubles”等浮点型所固有的舍入错误。

您已运行了“BankAccountTest”测试类的生成的“DebitTest”方法,注意它需要做的更改,请就此做出这些更改。现在,可以测试您应用程序中“Debit”方法的精确性。

先决条件:执行运行和自定义单元测试过程中的步骤。

运行单元测试并修复代码

  1. 运行 Debit 测试:在“测试视图”中选择“DebitTest”项,并单击“运行”。或者,右击“DebitTest”,再单击“运行选定内容”。

    在“测试结果”窗口的“结果”列中,当测试运行时,测试状态将显示为“正在运行”。测试运行完成后,测试的结果将更改为“未通过”。

  2. 在“测试结果”窗口中双击表示测试的行。

    这将打开“测试结果详细信息”页,其中显示以下错误消息:“Assert.AreEqual 失败。期望值: <0.77>,实际值: <23.21>”;这些数字似乎表明数学运算不正确。由于“BankAccountTest”类的“DebitTest”方法测试“BankAccount”类的“Debit”方法,所以从检查“Debit”方法开始。

  3. 在解决方案资源管理器中,双击 Bank 项目中的 Class1.cs 文件,并滚动到“Debit”方法。

  4. 请注意以下赋值:

    m_balance += amount;
    

    此赋值向余额增加金额,在“Debit”方法中,应当减去赋值。将此行更改为:

    m_balance -= amount;
    
  5. 再次运行“Debit”测试。

    在“测试结果”窗口的“结果”列中,将为“DebitTest”显示“已通过”。

    Note注意

    更改源代码后不必重新生成项目,因为运行测试时会生成项目而不进行提示。

您创建了一个可以运行的单元测试,并通过它查找和修复了代码中的错误。

先决条件:执行运行单元测试并修复代码过程中的步骤。

为私有方法创建和运行单元测试

  1. 在解决方案资源管理器中,双击 Bank 项目中的 Class1.cs 文件。

  2. 在 Class1.cs 文件的“BankAccount”类中,取消对以下代码的注释:

    // new enum:
    public enum accountType
    {
        Gold,
        Platinum,
    }
    // private method:
    private accountType GetAccountType
    {
        get
        {
            if (Balance > 15.00)
                return accountType.Platinum;
            else
                return accountType.Gold;
        }
    }
    
  3. 右击“GetAccountType()”方法,并选择“创建单元测试”。

    这将显示“创建单元测试”对话框。

  4. 在显示的树结构中,只选择了“GetAccountType()”方法。使其保留选定状态,然后单击“确定”。

    这样将创建一个名为 VSCodeGenAccessors.cs 的新文件,其中包含可在 BankAccount 类中检索私有实体值的特殊访问器方法。在解决方案资源管理器的测试项目文件夹中可以看到显示的新文件。

  5. 打开 Class1Tests.cs 文件并滚动到“GetAccountTypeTest()”方法。

  6. 注释掉下面的行:

    Assert.Inconclusive("Verify the correctness of this test method.");
    
  7. 在“GetAccountTypeTest()”方法中,找到使用 // TODO: 注释标记的三个赋值语句。将其更改为:

    string customerName = "Mr. Bryan Walton";
    double balance = 7.00;
    TestProject1.BankAccountNS_BankAccount_accountTypeAccessor val = TestProject1.BankAccountNS_BankAccount_accountTypeAccessor.Gold;
    
  8. 运行 GetAccountTypeTest 测试。

    在“测试结果”窗口的“结果”列中,最终测试状态显示为“已通过”。这是预期的结果,因为帐户余额设置为“7.00”时,accountType 应该为“Gold”。

  9. 在“GetAccountTypeTest()”中,将 balance 赋值更改为:

    double balance = 15.01;
    
  10. 重新运行 GetAccountTypeTest 测试。

    “GetAccountTypeTest()”测试将“GetAccountType()”方法返回的值与预期值进行比较,以测试该方法。在此测试中,为帐户余额 15.01 返回 Gold 值是不正确的。因此,预计该测试会生成结果“未通过”,指示测试的数字超出了 Gold 帐户类型的范围。

您已经添加了一个私有方法,为其创建了新的单元测试并运行了该测试。可以对 balance 变量使用其他边界值(如 15.00)来多次运行该测试。

对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分。有关更多信息,请参见演练:运行测试并查看代码覆盖率

可以在命令行中(而不是在 Visual Studio 中)运行测试。有关更多信息,请参见演练:使用命令行测试实用工具

社区附加资源

添加

私有方法的测试有问题

应该这样:
/// <summary>
///GetAccountType 的测试
///</summary>
[TestMethod()]
[DeploymentItem("bank.dll")]
public void GetAccountTypeTest()
{
// PrivateObject param0 = 7 ; // TODO: 初始化为适当的值
BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton",12.01); // TODO: 初始化为适当的值
BankAccount_Accessor.accountType actual;
actual = target.GetAccountType;




Assert.AreEqual(actual,BankAccount_Accessor.accountType.Platinum);
}

我也将此记录到的我博客上了http://blog.csdn.net/metababy


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值