科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用VSTS进行单元测试并生成用于Unit Test Framework的源代码(2)

使用VSTS进行单元测试并生成用于Unit Test Framework的源代码(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Scott 详细介绍自动化单元测试的基本内容,以及由 Microsoft Visual Studio 2005 Team System 提供的 Unit Test Framework 中包含的代码生成引擎。

作者:佚名 来源:CSDN  2007年8月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
测试

TestMethod

简单说,这些是您的测试。测试预期结果的逻辑,并报告未取得结果(如果有)。请将它看作您的“方法”。



测试装置

TestClass

针对大量测试的一个逻辑分组。请将它看作您的“类”。



测试套件

测试列表 **

针对大量测试装置的一个逻辑分组。请将它看作您的“类库”。

注不需要一个属性。



测试运行器

VS 2005 VSTS Unit Testing Framework

GUI/Console 应用程序负责发现、执行和报告测试结果。Visual Studio 2005 Team System 将作为本文的测试运行器。

测试装置示例

请考虑以下针对 BankAccount 类的类关系图,以及一个示例测试装置 (BankAccountTests.cs)。

图 1. BankAccount 类

示例测试装置: BankAccountTests.cs

using BankAccountDemo.Business;using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;namespace BankAccountDemo.Business.Tests{    [TestClass()]    public class BankAccountTest    {        [TestInitialize()]        public void Initialize()    {        }        [TestCleanup()]        public void Cleanup()   {        }        [TestMethod()]        public void ConstructorTest()   {            float currentBalance = 500;             BankAccount target = new BankAccount(currentBalance);            Assert.AreEqual(currentBalance, target.CurrentBalance,                 "Balances are not equal upon creation");        }        [TestMethod()]        public void DepositMoneyTest()  {            float currentBalance = 500;             BankAccount target = new BankAccount(currentBalance);            float depositAmount = 10;             target.DepositMoney(depositAmount);            Assert.IsTrue( (currentBalance + depositAmount) >                              target.CurrentBalance,                "Deposit not applied correctly");        }        [TestMethod()]        public void MakePaymentTest()   {            float currentBalance = 500;             BankAccount target = new BankAccount(currentBalance);            float paymentAmount = 250;             target.MakePayment(paymentAmount);            Assert.IsTrue(currentBalance - paymentAmount ==               target.CurrentBalance,                 "Payment not applied correctly");        }    }}

主单元测试概念 == 断言

用于该形式单元测试的主要概念是,自动化单元测试是基于“断言”的,即可定义为“事实或您相信为事实的内容”。从逻辑角度看,请考虑该语句“when I do {x}, I expect {y} as a result”。

这可以轻松地翻译为代码,方法是使用 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中可用的三个“断言”类中的任一个:Assert、StringAssert 和 CollectionAssert。主类 Assert 提供用于测试基础条件语句的断言。StringAssert 类自定义了在使用字符串变量时有用的断言。同样,CollectionAssert 类包括在使用对象集合时有用的断言方法。

表 3 显示可用于当前版本 Unit Testing Framework 的断言。

表 3. VSTS Unit Testing Framework 断言

断言类 StringAssert 类 CollectionAssert 类

AreEqual() AreNotEqual() AreNotSame() AreSame() EqualsTests() Fail() GetHashCodeTests() Inconclusive() IsFalse() IsInstanceOfType() IsNotInstanceOfType() IsNotNull() IsNull() IsTrue()

Contains() DoesNotMatch() EndsWith() Matches() StartsWith()

AllItemsAreInstancesOfType() AllItemsAreNotNull() AllItemsAreUnique() AreEqual() AreEquivalent() AreNotEqual()AreNotEquivalent()Contains()DoesNotContain() IsNotSubsetOf()IsSubsetOf()

这些自动化单元测试用什么运行?

正如前面提到的,xUnit 框架将“测试运行器”的概念定义为应用程序负责:(a) 执行单元测试;(b) 报告测试结果。对于本文,包含 Visual Studio 2005 Team System (VSTS) 的 Unit Testing 引擎作为我们的“测试运行器”。图 2 表示 BankAccountTests.cs 类的执行结果。

图 2. 测试结果窗格:单元测试执行结果

Microsoft Visual Studio 2005 使用源项目的代码模型动态填充该视图。它基于该源代码中的自定义属性动态发现有关该测试套件的信息。表 4 表示最常见的单元测试属性(以及执行的次序)。

表 4. 常见单元测试属性

属性 描述

TestClass()

该属性表示一个测试装置。



TestMethod()

该属性表示一个测试用例。



AssemblyInitialize()

在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之前,执行带有该属性的方法。



ClassInitialize()

带有该属性的方法在执行第一个测试之前调用。



TestInitialize()

带有该属性的方法在执行每个 TestMethod() 之前调用。



TestCleanup()

带有该属性的方法在执行每个 TestMethod() 之后调用。



ClassCleanup()

带有该属性的方法在执行 ALL 测试之后调用。



AssemblyCleanup()

在执行为执行选择的第一个 TestClass() 中的第一个 TestMethod() 之后,执行带有该属性的方法。



Description()

提供关于给定 TestMethod() 的描述。



Ignore()

由于某种原因忽略 TestMethod() 或 TestClass()。



ExpectedException()

当测试特定异常时,如果使用该属性指定的异常不是从实现代码引发,则测试不会失败。

我编写什么类型的测试?

一个方法及其相关测试之间很难有一对一关系。编写自动化单元测试需要开发人员“进行全面思考”,并了解关于对象的所有内容 — 它将如何消耗、使用、处理,以及在任何情况下如何起到积极、消极、非决定性作用。

例如,请考虑一个用于针对数据库中 Customer 项执行 CRUD(创建、检索、更新、删除)功能的典型对象方法。对于该对象的 Load() 方法,要针对以下方案编写测试:

? 构造函数测试 — 确保对象正确加载,带有正确的信息。



? PositiveLoadScalarTest — 测试数据库中一个 Customer 的成功加载。



? NegativeLoadScalarTest — 测试一个 Customer 的失败加载,即该 Customer 不在数据库中。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章