手工编写测试代码(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("验证此测试方法的正确性。");
        } 

 

 

posted @ 2010-04-11 21:05  邓维  阅读(3755)  评论(0编辑  收藏  举报