手工编写测试代码(C#)
http://blog.csdn.net/zszmz/archive/2007/12/13/1932868.aspx
手工编写测试代码(C#)
朱旻喆
2007-12-7
于北京信息工程学院
开发工具:VS2005
敏捷方法注重测试驱动。书中所写的测试代码都是手工编写的(当然,一开始是,后面就是用工具了),但是如何编写?测试代码放在哪里?
如果测试代码和原代码(注 意,不是源代码)放在同一个项目里面,那么,怎样可以做到不修改原代码就可以让测试代码执行--原代码是从整个项目的开头来执行的,里 面没有测试代码的执行部分。
如果测试代码和原代码不放在同一个项目里--实际上我比较喜欢这种方式,因为他让原代码和测试代码相分离--那么,会有很多类以及类的方法无法访问到(internal类型和private类 型,具体什么意思请查阅MSDN)。这样的话,就只能测试到public类的public方 法了。实际上我们还需要测试internal类的public 方法,甚至private方法。
对于第一种情况,貌似有很复杂的方法,比如用宏语句,不过我没有研究他,因为感觉这种方法要在原代码中增加测试代码,会十分杂乱。第二种情况的重点问题就 是如何让internal对别的项目是可见的。
这里要用到.net的一个机制了。
AssemblyInfo.cs文件,是VS2005用来管理程序集信息的文 件。在原代码的项目中打开这个文件。输入如下内容:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("TestProject")]
他的意思是让本项目的internal类型对TestProject项目是可见的。TestProject是你的测试项目名(注意,是项目名,不是 可执行文件的文件名,所以没有后缀)。如此,你就可以在你的测试项目中对原代码的internal类进行操作了。
下面是我的一个示例:
原代码中有一个类
class KK
{
public int Add(int a, int b)
{
return a + b;
}
}
现在我们要测试这个Add方法的输出是否正确。我新建了一个项目(TestProject)。并且我把KK类所属的项目程序集文件中加入上面那条语 句。我在TestProject项目中加入一个类
下面我在测试项目中添加一个测试类KKTest,并使用AddTest方法来测试Add方法。
class KKTest
{
public static bool AddTest()
{
KK k = new KK();
int a = 1;
int b = 2;
int expected = 3;
if (k.Add(a, b) == expected) return true;
else return false;
}
}
下面这是测试项目的主类
class Program
{
public static void Main()
{
if (KKTest.AddTest()) Console.Write("OK");
else Console.Write("Not Ok");
Console.Read();
}
}
这样的话,如果测试用例通过了,便会在命令行下输出OK。这里我只写了一个测试用例。 你也可以写多个测试用例,全部通过了就显示OK。用这种方法,我们就实现了手工快速编写代码进行测试。用这种方法,我们不需要使用第三方的工具。在进行代 码重构以及测试驱动编程的时候,用这种方法是非常方便的。
细心的读者一定发现了。上面的代码我们只完成了对internal类的public方法的测试。但是private的方法这样做是测试不了的。
对于这种情况,我自己没有想到方法,但是我们可以使用VS2005自己的测试功能。你在你想要测试的方法上点右键,选择Create Unit Test选项,然后跟着向导一步步地往下做,你就可以得到一个和上面的测试代码 结构类似的测试代码,但是这个测试代码是可以访问private的方法的。只是有一点区别,KK类是不能直接使用的,我们要使用KK_Accessor类来代替。因为VS2005自动做了映射。下面是代码
[TestMethod()]
[DeploymentItem("ConsoleApplication2.exe")]
public void AddTest()
{
KK_Accessor target = new KK_Accessor();
int a = 0; // TODO: Initialize to an appropriate value
int b = 0; // TODO: Initialize to an appropriate value
int expected = 0; // TODO: Initialize to an appropriate value
int actual;
actual = target.Add(a, b);
Assert.AreEqual(expected, actual);
}
而且,VS2005已经自动生成了一些代码。你使用Assert.AreEqual这 上断言方法就可以比较结果,而且还有错误的输出内容。如Expected<3>,But<2>.意 思就是测试用例的输出应该是3,但是Add方法输出结果是2,说明Add方法有Bug。
另外,你可以在测试代码上点右键,选择run test来进行测试。测试功能很强大。至于他用什么机制进行映射,使private方法可以访问到,我就不知道了。如果读者知道的还请赐教于我。
-----------------------------------------------------------------------------------------------//MySelf
//对于复杂一点点的类测试代码示例:
public void GetUserTest()
{
SqlserverUser target = new SqlserverUser(); // TODO: 初始化为适当的值
int id = 5; // TODO: 初始化为适当的值
User expected = new User(); // TODO: 初始化为适当的值
expected.Name = "DWDAVID";
expected.ID = 5;
User actual;
actual = target.GetUser(id);
Assert.AreEqual(expected.Name, actual.Name );
//Assert.Inconclusive("验证此测试方法的正确性。");
}