VS2005中的单元测试

一、 VS2005测试功能介绍

1.       测试简介

VS2005提供的新功能,可以直接在解决方案中创建一个测试项目,对一个或多个项目进行测试。测试项目会自动生成大部分的测试代码,只需要修改入参等值便可对代码进行自动测试。

2.       测试类型

单元测试:可调用类的方法,传递合适的参数,并验证返回值是否为所期望的值。

Web 测试:Web 测试是由一系列有序的HTTP 请求组成的,以获得有关它所请求的页或站点的测试报告特定详细信息。

负载测试:使用负载测试封装非手动测试,例如单元测试、Web 测试和一般测试,然后通过使用虚拟用户同时运行它们。

一般测试:一般测试是经过包装后在Visual Studio 中用作测试的现有程序。

手动测试:当测试任务将由测试工程师(而非使用自动脚本)完成时,使用手动测试类型。

顺序测试:使用顺序测试可按照您指定的顺序来执行一组测试。

3.       单元测试

使用单元测试可以创建用C++、Visual C# 或Visual Basic 编写的、演练源代码的编程测试。单元测试可调用类的方法,传递合适的参数,并验证返回值是否为所期望的值。

4.       Assert

使用 true/false 命题验证单元测试中的条件。如果此条件计算为 true,则断言通过。通过引发 AssertFailedException 来发出信号表示测试失败。

Assert 类可对特定功能进行验证。单元测试方法执行开发代码中的方法代码,但只有包含 Assert 语句时才能报告代码行为方面的内容。

二、 测试步骤

1.       创建一个WinForm项目

<1       打开VS2005,创建一个WinForm项目。

<2       在Form1上添加一个button,写上单击事件,并添加一个私有方法,运行成功。

2.       新建测试项目

<1       点击主菜单->测试->单元测试向导,选择创建新的Visual C#测试项目,并输入项目名称。

<2       在“创建单元测试”选择框中钩选要测试的项目,确定。

<3       这时VS2005会自动生成测试代码,并弹出一个等待框。

<4       完成后查看测试项目,会发现添加了很多测试类,如:Form1Test.cs,类里面的方法名也是诸如button1_ClickTest()的测试方法。

3.       运行测试项目

<1       生成测试项目,成功。

<2       选择主菜单->测试->窗口,打开测试视图或测试管理器,可以看到测试项目下的所有测试方法。

<3       钩选要测试的方法(如果是测试视图则用Ctrl/Shift直接选择记录使其高亮),右键调试选中的测试。

4.       测试结果

<1       通过:说明测试的方法没有问题。

<2       错误:可以看到错误的测试名称、项目、错误信息等,方便找出错误产生的原因。

<3       没有结论:无法验证不返回值的方法。

<4       所有测试的结果都可以在测试结果窗口中看到,双击会打开新页面显示更详细的信息。

三、 实例

1.       新建项目WinTestCandy

<1       新建窗体FrmTest,添加控件btnTest,txtInput

<2       添加私有方法如下:

private bool IsNum(string strInput)

{

    if (System.Text.RegularExpressions.Regex.Match(strInput, "^[0-9]*$").Success)

    {

      return true;

    }

    else

    {

 return false;

    }

}

<3       双击btnTest,在btnTest_Click事件中输入代码:

if (IsNum(txtInput.Text.Trim()))

{

    MessageBox.Show("Is Number");

}

<4       运行程序,画面如下:

2.       新建测试项目UnitTestCandy

<1       点击主菜单->测试->单元测试向导,选择创建新的Visual C#测试项目,并输入项目名称UnitTestCandy

<2       选择项目WinTestCandy创建单元测试,确定。

 

<3       这时VS2005会自动生成测试代码,并弹出一个等待框。

<4       完成后查看测试项目,有以下几个测试类:

FrmTestTest.csProgramTest.csResources.DesignerTest.csSettings.DesignerTest.csVSCodeGenAccessors.cs;类里面的方法名也是诸如button1_ClickTest()的测试方法。

<5       打开FrmTestTest.cs,找到IsNumTest()方法。内容如下:

/// <summary>

///IsNum (string) 的测试

///</summary>

[DeploymentItem("WinTestCandy.exe")]

[TestMethod()]

public void IsNumTest()

{

    FrmTest target = new FrmTest();

 

    UnitTestCandy.WinTestCandy_FrmTestAccessor accessor = new UnitTestCandy.WinTestCandy_FrmTestAccessor(target);

 

    string strInput = null; // TODO: 初始化为适当的值

 

    bool expected = false;

    bool actual;

 

    actual = accessor.IsNum(strInput);

 

    Assert.AreEqual(expected, actual, "WinTestCandy.FrmTest.IsNum 未返回所需的值。");

    Assert.Inconclusive("验证此测试方法的正确性。");

}

3.       修改IsNumTest()方法

<1       初始化strInput值为“123”

<2       修改预期值expectedtrue

<3       注释掉最后一句Inconclusive,该代码会引发一个“没有结论”的异常。

<4       最后代码如下:

FrmTest target = new FrmTest();

 

 UnitTestCandy.WinTestCandy_FrmTestAccessor accessor = new UnitTestCandy.WinTestCandy_FrmTestAccessor(target);

 

 string strInput = "123"; // TODO: 初始化为适当的值

 

 bool expected = true;

 bool actual;

 

 actual = accessor.IsNum(strInput);

 

 Assert.AreEqual(expected, actual, "WinTestCandy.FrmTest.IsNum 未返回所需的值。");

 //Assert.Inconclusive("验证此测试方法的正确性。");

 

4.       运行测试项目

<1       在测试管理器中钩选IsNumTest()方法,右键调试选中的测试。

<2       可以看到该测试已通过。

5.       分析代码覆盖率

<1       编辑测试运行配置,将要测试的项目加入代码覆盖率检测。

<2       测试完成后,查看代码覆盖率结果,并且可以选择合并以前的几次测试。

<3       点击“显示代码覆盖率着色”按钮,可以看到那些代码是测试已经覆盖到的,而哪些还未覆盖。

四、 其它

1.       可以在不打开项目的情况下对测试列表中的方法进行测试,只需要打开Visual Studio测试元数据文件(*.vsmdi)即可。

2. 自动生成的测试代码通常会包括以下代码:

Assert.Inconclusive("无法验证不返回值的方法。");

它会引发一个没有结论的异常。

关于Assert的成员,可以参考MSDN帮助文档,以下列出部分:

AreEqual

测试指定的值是否相等;如果两个值不相等,则测试失败。

AreNotEqual

测试指定的值是否不相等;如果两个值相等,则测试失败。

AreSame

测试指定的对象是否都引用相同的对象;如果两个输入内容引用不同的对象,则测试失败。

AreNotSame

测试指定的对象是否引用不同的对象;如果两个输入内容引用相同的对象,则测试失败。

Fail

断言失败。

Inconclusive

表示无法证明为 true 或 false 的测试结果。

IsTrue

测试指定的条件是否为 true;如果该条件为 false,则测试失败。

IsFalse

测试指定的条件是否为 false;如果该条件为 true,则测试失败。

IsNull

测试指定的对象是否为 空引用(在 Visual Basic 中为 Nothing);如果它不为空,则测试失败。

IsNotNull

测试指定的对象是否为非空;如果它为 空引用(在 Visual Basic 中为 Nothing),则测试失败。

posted @ 2008-11-29 12:38  tomin  阅读(1328)  评论(0编辑  收藏  举报