Visual Studio 2010单元测试(1)--运行和定义普通单元测试
在VS2010中,单元测试的功能很强大,使得建立单元测试和编写单元测试代码,以及管理和运行单元测试都变得简单起来,通过私有访问器可以对私有方法也能进行单元测试,并且支持数据驱动的单元测试。
1、建立单元测试项目1.1、从被测试代码生成单元测试1)实例:创建VC#模式下的控制台应用程序,工程名为CUnitTest
2)输入简单的加、减、乘、除函数代码,如下图所示
namespace CUnitTest{ class Program { public int Add(int a, int b) { return a + b; } public int Dec(int a, int b) { return a - b; } public int Mul(int a, int b) { return a * b; } public int Div(int a, int b) { return a / b; } static void Main(string[] args) { } }}
3)可按如下步骤建立单元测试
(1)在Add方法体内,单击鼠标右键,在菜单中选择“创建单元测试”,就能把一个类的测试代码的外壳都自动写好。
(2)在出现的“创建单元测试”界面中,Add方法被自动勾上,表示要为这个方法创建单元测试代码的基本框架,单击确定按钮
(3)点击确定后,在新建测试项目中,输入需要创建的单元测试的新项目的名称,然后单击“创建”按钮,则自动创建一个新的单元测试代码项目。
(4)在“解决档案资源管理器”中可以看到多了一个“AddTest”项目,可以看出“AddTest”项目引用了被测项目的程序集,和单元测试框架Microsoft.VisualStudio.QualityTools.UnitTestFrame,并且自动产生两个C#代码文件AssemblyInfo.cs和ProgramTest.cs
(5)ProgramTest.cs的代码如下图所示,从图中可以看到,自动产生了一个“ProgramTest”类,并使用[TestClass()]标识为一个单元测试类,以及一个“AddTest”测试方法,。并用[TestMethod()]标识。
using CUnitTest;using Microsoft.VisualStudio.TestTools.UnitTesting;using System;namespace AddTest{ /// <summary> ///这是 ProgramTest 的测试类,旨在 ///包含所有 ProgramTest 单元测试 ///</summary> [TestClass()] public class ProgramTest { private TestContext testContextInstance; /// <summary> ///获取或设置测试上下文,上下文提供 ///有关当前测试运行及其功能的信息。 ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } #region 附加测试特性 // //编写测试时,还可使用以下特性: // //使用 ClassInitialize 在运行类中的第一个测试前先运行代码 //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ //} // //使用 ClassCleanup 在运行完类中的所有测试后再运行代码 //[ClassCleanup()] //public static void MyClassCleanup() //{ //} // //使用 TestInitialize 在运行每个测试前先运行代码 //[TestInitialize()] //public void MyTestInitialize() //{ //} // //使用 TestCleanup 在运行完每个测试后运行代码 //[TestCleanup()] //public void MyTestCleanup() //{ //} // #endregion /// <summary> ///Add 的测试 ///</summary> [TestMethod()] public void AddTest() { Program target = new Program(); // TODO: 初始化为适当的值 int a = 0; // TODO: 初始化为适当的值 int b = 0; // TODO: 初始化为适当的值 int expected = 0; // TODO: 初始化为适当的值 int actual; actual = target.Add(a, b); Assert.AreEqual(expected, actual); //Assert.Inconclusive("验证此测试方法的正确性。"); } /// <summary> ///Dec 的测试 ///</summary> [TestMethod()] public void DecTest() { Program target = new Program(); // TODO: 初始化为适当的值 int a = 0; // TODO: 初始化为适当的值 int b = 0; // TODO: 初始化为适当的值 int expected = 0; // TODO: 初始化为适当的值 int actual; actual = target.Dec(a, b); Assert.AreEqual(expected, actual); //Assert.Inconclusive("验证此测试方法的正确性。"); //语句是默认添加的,意思是这个方法是Visual Studio自动创建,运行前自删除或注释此句,否则运行结果无法通过。 } }}
(6)ProgramTest.cs代码文件详讲
[TestMethod()]:说明了以下代码是一个测试用例
Int a = 0; // TODO: 初始化为适当的值
int b = 0; // TODO: 初始化为适当的值
这两句是被测函数的输入参数,需要我们去修改它的值,也就是我们输入测试用例的地方。
double expected = 0; // TODO:初始化为适当的值
double actual;
这两句话浅显易懂,前一句话是定义了期望值和对它进行初始化,后一句话是定义了实际值。默认
Assert.AreEqual(expected, actual);
Assert在这里可以理解成断言:在VSTS里做单元测试是基于断言的测试。
默认代码中Assert.Inconclusive表明这是一个未经验证的单元测试。在实际的程序中可以注释掉。