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.cs,ProgramTest.cs,Resources.DesignerTest.cs,Settings.DesignerTest.cs,VSCodeGenAccessors.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 修改预期值expected为true。
<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帮助文档,以下列出部分:
测试指定的值是否相等;如果两个值不相等,则测试失败。 |
|
测试指定的值是否不相等;如果两个值相等,则测试失败。 |
|
测试指定的对象是否都引用相同的对象;如果两个输入内容引用不同的对象,则测试失败。 |
|
测试指定的对象是否引用不同的对象;如果两个输入内容引用相同的对象,则测试失败。 |
|
断言失败。 |
|
表示无法证明为 true 或 false 的测试结果。 |
|
测试指定的条件是否为 true;如果该条件为 false,则测试失败。 |
|
测试指定的条件是否为 false;如果该条件为 true,则测试失败。 |
|
测试指定的对象是否为 空引用(在 Visual Basic 中为 Nothing);如果它不为空,则测试失败。 |
|
测试指定的对象是否为非空;如果它为 空引用(在 Visual Basic 中为 Nothing),则测试失败。 |