• Java测试技巧


    快捷键

    修改快捷键 window-》preference-》general-》keys:
    查找引用:ctrl+shift+g
    覆盖测试:alt+shift+E,T
    复制一行:ctrl+alt+down
    调试运行:alt+shift+D,T
    改为:
    查找引用:ctrl+g
    覆盖测试:ctrl+W
    复制一行:ctrl+d
    调试运行:ctrl+q

    概念

    变异(数字、返回值、errMsg)
    循环用例(BinarySearchTree test2)
    容易出现变异的地方(自定义异常)
    多个测试用例
    用反射(复制对比,Datalog hasCode)
    我的测试步骤(代码最多、私有函数)
    使用eclipse代码模板
    半自动化测试:生成随机数据、记录随机数据来跑分支,记录对应的结果来断言

    bug检测率

      针对特定的应用场景,写好了测试用例,运行测试用例,发现程序的行为和测试用例中预期的不一致,则称这个程序出bug了。

      行为不一致的具体表现为:返回值、运算符、条件判断、数值(引用、数字、字符串变化)等。这些在项目升级或者完善的时候容易出现,这时,测试用例就派上用场了,能用于检测升级后是否出现了bug。

      如何检测测试用例的有效性呢?主要指标是分支(语句)覆盖率和bug检测率。以上可见,bug出现在项目升级或者完善时,改动而来的变化,但在实际应用中不可能等到项目升级了才来检测用例是否有效,有工具可以来模拟这些变化,这些变化则称之为“变异”,将程序输入,进行变异后,输出多份代码。每份代码都认为出现了bug,因为里面的部分代码被工具改动了,即和原来的项目代码表现不一致了。用这些变异后的代码运行测试用例,要求测试用例运行失败,这样才算是检测出bug了,否则都通过的话,则没检测出bug。

    插件

    覆盖率插件:eclemma
    变异插件:http://muclipse.sourceforge.net/site/site.xml
    https://sourceforge.net/projects/muclipse/?source=typ_redirect

    反射例子

    package refExample;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Main {
        public static void main(String[] args) throws Exception{
            
            Class clazz = A.class;
            
            {    //调用有参静态方法
                Method f1 = clazz.getDeclaredMethod("f2", new Class[]{int.class});
                f1.setAccessible(true);
                f1.invoke(null, 123);
            }
            {  //调用无参静态方法
                Method f1 = clazz.getDeclaredMethod("f2", null);
                f1.setAccessible(true);
                f1.invoke(null, null);
            }
            { //设置静态属性
                Field field = clazz.getDeclaredField("aa");
                field.setAccessible(true);
                field.set(null, 7);
                
                Method f1 = clazz.getDeclaredMethod("f1",null);
                f1.setAccessible(true);
                f1.invoke(null, null);
            }
            { //设置成员属性
                A a = (A) clazz.newInstance();
                Field field = clazz.getDeclaredField("a");
                field.setAccessible(true); 
                field.set(a, 99);
                
                Method f1 = clazz.getDeclaredMethod("f3",null);
                f1.setAccessible(true);
                f1.invoke(a, null);
            }
        }
        
    }
    class A{
        private static int aa;
        private static void f1(){
            System.out.println(aa);
        }
        private static void f2(int a){
            System.out.println(a);
        }
        private static void f2(){
            System.out.println("no p 2 ");
        }
        
        private int a;
        private void f3(){
            System.out.println(a);
        }
    }
  • 相关阅读:
    在WM中画个带有边框的Panel
    在PPC上安装SQL Mobile库
    利用SQL语句清理日志
    Asp.net Ajax 中的脚本错误: Sys未定义的解决方法
    python搭建简易服务器
    STL源码剖析读书笔记第3章
    mongodb 查找 排序 索引 命令
    STL源码剖析读书笔记第2章
    词排序
    关于淘宝直通车优化的一点感悟
  • 原文地址:https://www.cnblogs.com/hellohello/p/8064341.html
Copyright © 2020-2023  润新知