起步于系统工程师,迈进入测试工程师,从起初的C/S系统到互联网时代的B/S系统,从事过电信增值业务、软交换、烟草OA、公安技侦和电子商务等行业的软件测试开发和管理多年,愿与大家共同分享共同交流,关注软件项目管理、测试团队管理、软件流程控制和软件性能测试及自动化测试技术。互联网时代,技术推动进步,欢迎人才推荐:jonas.wangl@alibaba-inc.com

发布新日志

  • 软件测试中常用的几种纠错技术

    2008-11-11 13:25:36

        纠错先要查错。查错的工作量通常占整个纠错的十分之九以上。所谓纠错的技术,主要是指查明程序错误时可能采用的工具和手段。这些手段如果运用得当,就能明显的提高查错的效率。

      1、插入打印语句

      在程序中插入暂时性的打印语句,是一种十分常见的查错技术。这类打印语句的作用主要是显示程序的中间结果或有关变量的内容。插入打印适用于任何高级语言书写的程序。但其输出与程序的原输出夹杂在一起,需要注意分辩。此外,纠错结束后必须记住将它们删除。

      2、设置断点

      查错的基本技术之一,就是在程序的可疑区设置断点。每当程序执行到设置的断点时,就会暂停执行,以便纠错者观察变量内容和分析程序的运行状况。

      3、掩蔽部分程序

      对可疑程序进行检查时,常常要让程序反复执行。如果整个程序较长,可疑区仅占其中的一小部分,则每次运行整个程序,必将浪费许多时间和精力。在这种情况下,明智的作法是把不需要检查的程序掩蔽起来,只让可疑的部分程序反复运行。

      掩蔽无关程序可使用下述方法:

      (1)在要掩蔽的语句行加上注释符,使解释或编译程序把它们当作注释行,不予处理。

      (2)把要掩蔽的程序段置入一个“常假”的选择结构中,使它总没有机会执行。

      (3)用GOTO语句跳越要掩蔽的程序段

      无论使用哪一种掩蔽方法,纠错结束后都应撤销掩蔽,使程序复原。

      4、蛮力纠错技术(Dubugging by Brute Force)

      某些系统或调试程序能提供一种“转储”命令(DUMP),用来打印出内存可疑区或输出文件的全部内容,供纠错者分析使用。这种作法的优点是信息齐全,只要有耐心,总可以找出问题。但输出的数据量大,从中寻找错误的迹象好比大海捞针,效率很低。如果说前3种技术都重视分析与错误有关的信息,DUMP命令却不论数据与错误有无关联,一律拿出来“曝光”。所以有些文献称之为蛮力纠错,仅在程序很小或其他纠错手段未能奏效时才使用这种方法.--转载Csai.cn

  • 【整理】单元测试假成功和假失败的避免方法

    2008-11-04 20:52:25

            1 基本信息

            摘要:描述了单元测试要避免的几个问题,并给出几个最佳实践建议。

            2 假成功的单元测试

            <1>问题描述:

            在testXXX方法中,看到有这样的测试代码:3. 解决方法:

             public void testInvoke(){
            try{
            …
            assertEquals(a,b);
            }
            catch(Exception e){
            …
            }
            }

            <2>问题分析:如果运行过程中没有出现异常,整个流程不会有任何问题,JUnit也认为整个测试正常通过。

            但是一旦try中的某段代码运行出错,我们会发现由于在assertEquals被调用之前就已经跳到catch中,所以assertEquals并没有被执行,而catch及之后的代码中并没有相应的assertEquals语句,因此JUnit认为这个testXXX方法对应的测试用例正常通过,我们被结果欺骗了。

            将assertEquals语句移道try…catch之外,变成如下的代码样式:

             public void testInvoke(){
            Object a;
            Object b;
            try{
            …
            // assertEquals(a,b);
            }
            catch(Exception e){
            …
            }
            assertEquals(a,b);
            }

            3  假失败的单元测试

            有的时候被测试方法在申明的时候有throws语句,那么单元测试代码应该小心处理这个问题.

            如果测试方法直接throws被测试方法所扔出的异常,则在被测试方法扔出这个异常的时候,该单元测试被认为是失败;但是作为被测试方法来讲,扔出该异常可能是正常的处理逻辑,而不能被认定是代码有错误. 称这种情况为"假失败"的单元测试.

            4 最佳实践

            单元测试最好不要有try/catch这些内容,这些内容应该是正式代码中处理的。

            单元测试只要在故意测试异常时才应该用到try/catch,如需要在某个环境下是否抛出某个异常;而其它情况try/catch应该避免使用。

  • Agitar 工具

    2008-11-04 20:47:34

         传说大名鼎鼎的AgitarOne就不用解释了,在昨天的随笔中有一些解释,今天主要说说Agitar 中Mockingbird的使用。

            为了提高测试代码的Coverage,仅仅靠AgitarOne来处理2K多行的方法,是肯本不够的。我现在搞的那个方法覆盖率才20%,不过比同事的 10%好多了。不过都是测试异常的Test Case,一个正向的Test Case的没有。只能硬着头皮看人家生成的代码来提高代码Coverage,在AgitarOne生成代码中,大量使用了MockingBird来 Mock对像,对于Mock对象我想大家都应该很清楚了吧。下面我将概要的介绍以下AgitarOne的MockingBird对象。

            MockingBird 最主要的也就是以下5个API:

            1.MockingBird.getProxyObject(), 该方法是创建一个Mock实例,比如我们想创建一个XXXHome 的mock 代码如下:

            XXXHome xxxHome =(XXXHome)MockingBird.getProxyObject(XXXHome.class)

            2.Mockingbird.setReturnValue() 该方法指定一个方法返回特定的值。比如我们想调用getConnection 返回一个Mock 真是的Xmock对象, 代码如下:

            Mockingbird.getReturnValue(getConnection(),Xmock)
            ;
            3.MockingBird.enterRecondingMode() 该方法就是使MockingBird进入录制模式。现在不好说清楚, 下面会有代码解释。

            4.MockingBird.enterTestMode() 该方法就是使MockingBird就如测试模式。

            5.MockingBird.setException 该方法使一个方法抛出异常。比如我们想如果调用getConnection 抛出SQLException,代码如下:

            MockingBird.setException(getConnection,new SQLException("sql exception!"))

            下边将表述如何使用。

            假如要测试以下方法,在这个方法中使用了第三方的代码,比如是EJB或者是数据库连接,那么我们在测试这个方法时难道好一定要有EJB容器或者真是的数据库吗?

            使用了MockingBird 就OK了!

            private int getValue()

            {

            thirdPart x = Global.getThirdPart();

            Connection connecton = x.getConnection();

            return connection.getValue("test");

            }

            对于Global.getThirdPart() 我们可以Mock一个thirdPart 而不是实际的对象,同理 Connection也是。首先我们创建两个Mock对象。

            thirdPart x =MockingBird.getProxyObject(thirdPart.class);

            Connection connection =MockingBird.getProxyObject(Connection .class);

            // 进入录制模式

            MockingBird.enterRecondingMode();

            //Mock Global.getThirdPart(); 方法

            Mockingbird.setReturnValue(Global.getThirdPart(),x);

            //Mock x.getConnection(); 方法

            Mockingbird.setReturnValue(x.getConnection(),connection );

            //Mock connection.getValue(); 使之返回为4

            Mockingbird.setReturnValue(,connection.getValue("test") ,4);

            进入测试模式

            MockingBird.enterTestMode()

            必须先进行录制状态进行录制,然后才能就是测试状态使用之前设置的录制值。

            然后对于这个方法的测试将很简单 只要调用给方法 看是不是返回4就可以了,完全与环境无关。

Open Toolbar