NUnit 测试用例代码生成器






4.59/5 (15投票s)
自动生成 NUnit 测试用例代码模板,从要测试的方法开始。

引言
每当您需要测试一个具有大量 public
方法且开发者未编写单元测试用例的新代码库时,您都可以使用 NUTestCaseCodeGenerator
自动生成 NUnit 测试用例,逐个方法生成。该工具允许您从待测试库的方法开始,生成 NUnit 测试用例的 C# 源代码模板。
要运行此应用程序,需要满足以下条件:
- Windows XP SP2 或 Windows 2003 Server SP1
- IIS 5.1/6.0 (从 Windows 组件中添加)
- Visual Studio 2005
- Microsoft Framework 2.0 (SP2 或 VS05 通常已安装)
- NUNIT Framework 2.4.7
NUTestCaseCodeGenerator
不会检查系统要求,它只是一个用于教学目的的初步想法,没有图形用户界面,代码也未经过优化。
背景
单元测试是对应用程序最小可测试部分(方法)的测试。单元测试通常由软件开发人员执行,以确保他们编写的代码符合软件要求并按预期行为运行。
测试驱动的软件开发技术要求在编写代码的每个方面之前,都先编写一个定义代码要求的自动化单元测试。这些测试包含断言,其结果要么为真,要么为假。
运行测试可以在代码不断演进和重构的过程中快速确认其正确行为。NUnit 等测试框架提供了一种创建和运行自动化测试用例集的方法。在测试驱动开发中,每个功能都从编写测试开始,因此对于每个方法,开发人员都必须编写相关的单元测试用例。每个方法将根据其签名复杂性拥有多个测试用例。
在现实世界中,开发人员没有时间编写单元测试,软件仅在集成测试或系统测试阶段进行测试。然而,在这些阶段,并非所有方法或模块的交互都与所有可能的参数都得到调用,也并非所有回归都得到检查。因此,代码覆盖率和软件质量较低,集成和系统测试阶段也非常困难。
关于单元测试重要性的另一个考虑因素是,即使编写单元测试需要大量时间,它们也是唯一真正可自动化的测试类型,因为您直接操作代码。因此,单元测试可以在没有测试人员的情况下运行。这更优越,因为集成和系统测试难以自动化且耗时,因为它们涉及 GUI 交互。
正如我之前所说,软件开发的现实世界并非“先测试”,而是“后测试”,并且在主要的测试阶段(单元、集成和系统)之间没有明确的划分,因此,越来越频繁地采用混合方法。在集成和系统测试阶段利用单元测试框架,使用框架的实用功能自动评估结果而无需人工干预,并在单元测试用例中嵌入的不仅仅是单个方法调用,而是一个流程,即一系列方法调用和 GUI 交互。这是测试主要软件用户功能的一种不同方式,而这些功能通常在集成和系统测试阶段手动进行测试。
要使测试真正自动化,有两个问题需要解决。首先,使“操作”自动化(对于库测试调用方法,对于 GUI 测试单击按钮)。其次,使操作结果的评估自动化。
有许多框架可以帮助您实现软件测试自动化,您可以将它们协同工作。我刚才提到了 NUnit 用于代码库单元测试,但它并非唯一,还有 WatiN 用于 ASP.NET 页面,NUnitForms 用于 .NET Windows Forms。
在下面的示例中,您可以看到一个非传统的 NUnit 测试,可用于自动化的集成和系统测试,其中两个测试框架协同工作以执行比单元测试更复杂的序列。
这可能是一种使用(或滥用)单元测试的方式,但正如我之前所说,这是为了实际应用。
using System;
using NUnit.Framework;
using Watin.Core;
namespace ExampleLibraryToTest_NU
{
[TestFixture, Description("ExampleLibraryToTest.Class1")]
public class Class1_Fixture
{
[Test, Description("ASPNET GUI testing")]
public void ASPNET_GUI_Testing_TC()
{
//This is WatiN - create IE instance, open the browser and go to default page
IE ie = new IE("https://:1036/WebSite1/Default.aspx");
//This is NUnit - check that ie instance is not null
Assert.IsNotNull(ie, "Error creating IE instance.");
//This is WatiN - get first cell value of the HTML table
string cellVal = ie.TableCell(Find.ByIndex(0)).Text;
//This is NUnit - check that first cell value is correct
Assert.That(cellVal, Is.EqualTo("ValueExpected"), "Error");
//This is WatiN - Click OKButton
ie.Button(Find.ById(New Regex(OKButton))).Click()
//This is NUnit - check something by code
string ret = UserLibrary.GetResultOfClick();
Assert.That(ret, Is.EqualTo("ValueExpected"), "Error");
//Other steps of procedure......
}
}
}
Using the Code
在启动应用程序之前,请打开一个 *.config 文件并设置 NUnit 的安装路径。
add key="NUnitFrameworkInstall" value="C:\Program Files\NUnit 2.4.7\"
NUTestCaseCodeGenerator 分两步进行工作:
第一步,在左侧面板加载待测试的 .NET 程序集,从左侧面板拖放一个包含待测试方法的类到右侧面板,并勾选所需的方法。在右侧面板的上下文菜单中,选择第一个选项,“创建 NUnit 源代码和 VS 项目”。
Visual Studio 将使用 NUnit 测试用例源代码的项目模板打开,因此您需要为方法输入变量和用于返回结果评估的 NUnit 语句赋值,例如 Assert.That(return, Is.EqualTo("在此处放入期望值"))
,然后构建项目。
例如,如果您需要测试一个签名如下的方法,包含...
public bool M3_WithClass(int MyInt1, int MyInt2, Class1_2 cl1_2)
...这将是应用程序自动生成的 Nunit 测试用例代码。
namespace ExampleLibraryToTest_NU
{
[TestFixture, Description("ExampleLibraryToTest.Class1")]
public class Class1_Fixture
{
[Test, Description("M3_WithClass")]
public void M3_WithClass_TC()
{
//Create a Class instance
Console.Out.WriteLine( "Try to instance Class" );
ExampleLibraryToTest.Class1 myClToTest = new ExampleLibraryToTest.Class1();
Assert.IsNotNull(myClToTest,
"Error creating ExampleLibraryToTest.Class1 instance.");
Console.Out.WriteLine("instance ok");
//Declare method input variable, remember to valorize it.
System.Int32 MyInt1 = 0;
System.Int32 MyInt2 = 0;
//Create a Class instance
Console.Out.WriteLine( "Try to instance Class" );
ExampleLibraryToTest.Class1_2 cl1_2 = new ExampleLibraryToTest.Class1_2();
Assert.IsNotNull(cl1_2,
"Error creating ExampleLibraryToTest.Class1_2 instance.");
Console.Out.WriteLine("instance ok");
//Test the method
Console.Out.WriteLine("Call the method");
//************ Method to test ************
System.Boolean ret = myClToTest.M3_WithClass(MyInt1,MyInt2,cl1_2);
//****************************************
//Remember to valorize expected return
Assert.That(ret, Is.EqualTo("Boolean"), "Error");
Console.Out.WriteLine("Method ok");
}
}
}
第二步,在左侧面板加载一个刚刚创建的包含测试用例的 NUnit 程序集,从左侧面板拖放一个包含测试用例的类 fixture 到右侧面板。在右侧面板的上下文菜单中,选择第二个选项,“创建 NUnit 项目和 Web 应用程序”。
将创建一个 NUnit GUI 应用程序,用于从 GUI 应用程序运行测试用例,并且还会自动创建一个 Web 页面,用于从不同的调用者环境调用相同的测试用例。这允许您检查安全性和访问问题,因为在 Windows 应用程序进程中,所有者是登录用户;而在 Web 应用程序进程中,所有者取决于配置。
在附件的 zip 文件中,有一个 .NET 库 ExampleClassLibraryToTest
用于演示,请尝试加载它。
关注点
以下是值得关注的要点的简要总结,因为代码太长(请参阅附件中的源代码)。
- 应用程序的核心是一个递归方法(
RecursiveInspecting()
),用于使用反射探索程序集并将内容加载到 TreeView 中(参见 Actions.cs 文件中的 INSPECTING 区域)。 - 创建 Visual Studio 项目:目录结构以及 AssemblyInfo.cs、projectName.csproj、NUnitTestCase.cs 文件(参见 Actions.cs 文件中的 VS PROJECT 区域)。
- 创建 NUnit 项目文件:XML 文件 .nunit(参见 Actions.cs 文件中的
CreateNUnitProj()
方法)。 - 在本地 IIS 中创建 Web 应用程序:创建虚拟目录、wwwroot 上的目录结构以及所有文件和 DLL(参见 Actions.cs 文件中的 WEB APPLICATION 区域)。
待办事项
所有文件,包括 XML、CS 等,都是使用 StringBuilder
类像文本文件一样构建的,但最好为每种文件类型使用适当的生成器,或者使用类序列化代替生成器(一种更优雅的解决方案)。
历史
- 2008 年 8 月 8 日:初次发布
- 2008 年 8 月 12 日:文章更新
- 2008 年 8 月 13 日:源代码和文章更新