使用 Visual Studio 2005 Team System 进行单元测试5
点击次数:24 次 发布日期:2008-11-26 11:48:28 作者:源代码网
|
源代码网推荐 在我们对该测试装置进行特别查看之前,让我们看一下在代码生成过程中创建了什么。 源代码网推荐 源代码网推荐 首先,它创建了 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 valueBankAccount target = new BankAccount(initialBalance);float depositAmt = 0; // TODO: Initialize to an appropriate valuetarget.DepositMoney(depositAmt);Assert.Inconclusive("A method that does not return a value" + "cannot be verified.");} 源代码网推荐 请注意该生成引擎除创建一个 stub TestMethod() 对象外,是如何进行其他操作的。它创建了适用于接口的示例单元测试,包括: 源代码网推荐 源代码网推荐 • BankAccount 对象的分配和结构(测试的对象主题) 源代码网推荐 源代码网推荐 • 本地变量的创建和默认分配,这些变量表示作为该测试主题的方法/构造函数所需的参数。 源代码网推荐 源代码网推荐 • TODO 注释,提醒开发人员适当地分配参数变量。 源代码网推荐 源代码网推荐 源代码网推荐 • 如果测试基于一个源对象方法调用,则生成的代码将包含对该方法(带有用于这些参数的局部变量)的调用。 源代码网推荐 源代码网推荐 • 初始 Assert() 方法调用,基于该方法的返回值。 源代码网推荐 源代码网推荐 • Assert.Inconclusive() 方法调用,作为完成测试代码的提示程序。非确定性测试将在 Test Results 对话框中显示为失败。 源代码网推荐 源代码网推荐 源代码网推荐 返回页首 源代码网推荐 生成后:我现在需要做什么? 源代码网推荐 考虑要完成相同的操作可以不必做哪些事情,则通常可以认识到代码生成的好处。在我们的示例中,我们不必: 源代码网推荐 源代码网推荐 • 创建单元测试项目。 源代码网推荐 源代码网推荐 • 设置项目引用。 源代码网推荐 源代码网推荐 • 添加适当的测试类(一个或多个)。 源代码网推荐 源代码网推荐 • 生成主干 Unit Test Framework 类和属性。 源代码网推荐 源代码网推荐 • 创建单个测试方法。 源代码网推荐 源代码网推荐 • 创建特定于接口的逻辑。 源代码网推荐 源代码网推荐 源代码网推荐 由于代码生成过程创建了特定于对象接口的示例单元测试,因此我们接近于初始测试的完成阶段了。通常情况下,只需“填充空白”并完成断言(一个或多个),方法是将“已知的数据值”分配给属性变量并创建适当的 Assert() 方法。显然,这不是针对所有测试的示例,特别是对具有多个断言的复杂测试而言。 源代码网推荐 源代码网推荐 只需几秒钟的时间(使用相对较少的击键),您就能够将生成的单元测试代码转换为这些实际的测试。 源代码网推荐 源代码网推荐 例如,请考虑我们以如下方式开始。 源代码网推荐 源代码网推荐 [TestMethod()]public void DepositMoneyTest(){float initialBalance = 0; // TODO: Initialize to an appropriate valueBankAccount target = new BankAccount(initialBalance);float depositAmt = 0; // TODO: Initialize to an appropriate valuetarget.DepositMoney(depositAmt);Assert.Inconclusive("A method that does not return a value " + "cannot be verified.");} 源代码网推荐 我们能够完成相对容易且具有有限击键的测试(更改部分用黑体表示)。 源代码网推荐 源代码网推荐 [TestMethod()]public void DepositMoneyTest() {float currentBalance = 500; BankAccount target = new BankAccount(currentBalance);float depositAmt = 10; target.DepositMoney(depositAmt);Assert.AreEqual(currentBalance + depositAmt, target.CurrentBalance, "Deposit Test: Deposit not applied correctly");} 源代码网推荐 返回页首 源代码网推荐 重新生成单元测试代码 源代码网推荐 好消息是,代码生成过程不会让您重写以前生成(和修改)的单元测试。使用 Visual Studio 2005 Team System 的 Beta 2 版本,代码生成选项提供一个启用/禁用创建已存在测试的复选框。如果选择它,而且该过程找到了一个具有相同名称的现有测试,则该过程将忽略该测试方法,并创建后续测试,从而将一个数字附加到该方法名的末尾。这通常在对象中使用重载的方法或构造函数时发生,或者当单击 Generate 按钮而不取消选定现有测试时发生。 源代码网推荐 源代码网推荐 返回页首 源代码网推荐 自动化单元测试建议 源代码网推荐 虽然本节可以独立成文,但这里只是一些您在创建单元测试时可以采纳的基本建议。 源代码网推荐 源代码网推荐 • 设计彼此独立的单元测试,其中它们可以独立运行(由于可以通过测试 UI 随意选择或取消选定它们)。 源代码网推荐 源代码网推荐 • 不要只进行正面测试。请确保代码能够响应任何方案,包括发生意外时(资源不可用,数据库只读等)。 源代码网推荐 源代码网推荐 • 把自己当作一个 QA 人员,想象成一个测试人员,而不仅仅是一个开发人员。您花在设计单元测试上的时间将有助于减少日后解决故障所用的时间。请注意对象的几个小细节:数据如何在对象之间传输?谁使用它们?销毁对象容易吗?如果我“进行此操作”,将会发生什么? 源代码网推荐 源代码网推荐 • 跳出您自己的思维模式。尽可能多地对测试进行头脑风暴。当您完成时,回头查看您可能漏掉的内容。来自团队成员的请求反馈 — 例如,他们创建了什么其他类型的测试?其他人可能提供一个对熟悉自己代码的开发人员而言非常困难的观点。 源代码网推荐 源代码网推荐 • 代码覆盖。使用 VSTS 代码覆盖规范提供有关每个测试运行中实际执行多少代码的信息(代码的行数,占所有代码的百分比)。如果编码完成,并且通过了所有测试,但代码覆盖显示只执行了该逻辑的一小部分,那么您的测试真的成功了吗?高代码覆盖不一定意味着您具有一个完整的“测试”集,而未覆盖的代码通常非常适用于一个新的测试用例。 源代码网推荐 源代码网推荐 • 当生成单元测试时,要帮助其他人了解您的代码: 源代码网推荐 源代码网推荐 • 使用一个项目结构,该结构映射所测试程序集的结构。 源代码网推荐 源代码网推荐 每个程序集有一个相关的测试程序集。 源代码网推荐 源代码网推荐 每个类有一个相关的测试类。 源代码网推荐 源代码网推荐 在各自的测试方法中包含每个方法名(即,Load() 将有 PositiveLoadTest()、NegativeLoadTest()、PositiveScalarLoadTest() 等的测试方法)。 源代码网推荐 源代码网推荐 • 使用一致的命名协定,包括对象的属性和方法名。 源代码网推荐 源代码网推荐 源代码网推荐 • 此外,当其他所有测试都失败时,请进行调试。自动化单元测试应该有助于减少您用在调试器上的时间。但是,如果测试结果和代码覆盖无法提供测试失败的原因,那么您大可不必担心调试单元测试。从 Beta 2 版的 Visual Studio 2005 Team System 开始,开发人员可以使用 Test Manager 中的 Debug checked tests 选项调试他们的单元测试程序集。 源代码网推荐 源代码网推荐 源代码网推荐 返回页首 源代码网推荐 小结 源代码网推荐 自动化单元测试为开发环节提供了一个结构化、自行纪录、高度便携且可重复的过程。如果在搜索现有程序集,或者如果开发环境需要在开始开发之前进行完整的设计,则请考虑使用内置到 Microsoft Visual Studio 2005 Team System 中的代码生成引擎。Visual Studio 2005 Team System 的单元测试代码生成功能可以为您节省宝贵的时间,而且有助于强制团队的开发标准和约定。通过生成用于自动化单元测试的基本内容,包括生成带有对象创建的测试方法、参数变量和基断言类,您应该能够顺利地在您的开发方法论中采用自动化单元测试。 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
