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

  • 相关阅读:
    从0开始学习ssh之搭建环境
    yii2-user 一个好用的用户扩展
    yii2下使用支付宝
    SQL迅速增加表中记录语句
    浅谈Java分页技术
    浅谈JavaWEB入门必备知识之Servlet入门案例详解
    CSS控制之IE常见BUG及解决方案
    Java-Swing编程之对话框案例详解
    浅谈Java工具类CommonUtils的使用
    浅谈Log4j
  • 原文地址:https://www.cnblogs.com/no7dw/p/1709773.html
Copyright © 2020-2023  润新知