TDD(测试驱动开发)一直都是敏捷里一个重要的方法,毕竟经过测试用例检验过的代码总会让人更加放心,关于软件测试我们有白盒测试,黑盒测试,灰盒测试等许多手段,其中单元测试更是必不可少而且非常有效。VS.net环境的单元测试是做得比较智能化而且好用的,我们就来试试吧。
首先,打开VS2010,创建一个简单的C#控制台程序,输入如下代码:(简单的加法减法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static int add(int a, int b)
{
return a + b;
}
public int sub(int a, int b)
{
return a - b;
}
static void Main(string[] args)
{
Console.WriteLine(add(3, 4));
}
}
}
然后在函数“add”的名称上邮件鼠标,选择创建单元测试用例如下图
VS2010自动为我们创建一个新的测试项目,打开其中的源文件ProgramTest.cs,设置自己的测试集(为了展示方便,sub函数我也增加单元测试)
/// <summary>
///add 的测试
///</summary>
[TestMethod()]
[DeploymentItem("ConsoleApplication1.exe")]
public void addTest()
{
int a = 5; // TODO: 初始化为适当的值
int b = 3; // TODO: 初始化为适当的值
int expected = 11; // TODO: 初始化为适当的值
int actual;
actual = Program_Accessor.add(a, b);
Assert.AreEqual(expected, actual);
//Assert.Inconclusive("验证此测试方法的正确性。");
}
/// <summary>
///sub 的测试
///</summary>
[TestMethod()]
[DeploymentItem("ConsoleApplication1.exe")]
public void subTest()
{
Program_Accessor target = new Program_Accessor(); // TODO: 初始化为适当的值
int a = 5; // TODO: 初始化为适当的值
int b = 2; // TODO: 初始化为适当的值
int expected = 3; // TODO: 初始化为适当的值
int actual;
actual = target.sub(a, b);
Assert.AreEqual(expected, actual);
//Assert.Inconclusive("验证此测试方法的正确性。");
}
}
运行测试项目,可以看到下面的测试结果,然后再针对结果去查询出错时因为程序的bug还是测试集选取的问题。
我再增加一个类实现求幂的功能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Test
{
private int a;
private int b;
Test()
{
a = 3;
b = 4;
}
public int pow()
{
return int.Parse(Math.Pow(a, b).ToString());
}
}
class Program
{
static int add(int a, int b)
{
return a + b;
}
public int sub(int a, int b)
{
return a - b;
}
static void Main(string[] args)
{
Console.WriteLine(add(3, 4));
}
}
}
同样的方法针对Test添加单元测试,如下(3的4次方是81):
/// <summary>
///pow 的测试
///</summary>
[TestMethod()]
public void powTest()
{
Test_Accessor target = new Test_Accessor(); // TODO: 初始化为适当的值
int expected = 81; // TODO: 初始化为适当的值
int actual;
actual = target.pow();
Assert.AreEqual(expected, actual);
//Assert.Inconclusive("验证此测试方法的正确性。");
}
然后运行测试项目,可以看到如下结果:
我觉得编写测试代码是一个好习惯,不过如何设计测试用例,如何能够让测试用例覆盖程序的所有分支确实是比较麻烦的事情,不过多做单元测试还是能对提升我们编码质量,增强我们的编程信心,呵呵