• 在代码层描述质量属性的可测试性


    代码层描述质量属性可测试性(由于上次的个人理解过于官方简短,导致。。重新编辑)

    1.输入/输出

    1.1记录回放:捕获跨接口的信息,作为测试专用软件的输入,记录的数据以后还以进行对比,(官方版)

    (个人理解)我觉得这一部分主要就体现在日志方面,日志的作用也是为了测试方便,就好比现在的每个软件基本都会有存在好多个日志文件,这些日志文件捕获不同时间不同操作的数据,进行规范化输出,形成一个可以解析的历史数据,有了日志文件,我们就可以在一定程度上允许错误的产生,在错误产生后,通过日志文件的输出记录可以查看到底是哪里出了错误,出的是什么类型的错误,还可以通过日志文件进行回复数据(比如某些数据库,产生很详细的日志,每一条建库建表语句,插入语句,删除等等,到时候只需要执行这些日志文件就可以恢复数据库)

    (个人实例)信息捕获并写入日志文件:

    //捕获参数,并写入日志
            String path = "C:\Users\hp\Desktop\数据\test\canshu.log";
            File file =new File(path);
            FileWriter fw;
            try {
                fw = new FileWriter(file,true);
                BufferedWriter bw = new BufferedWriter(fw);
                String str1 = String.valueOf(discountFactor);
                String str2 = Arrays.toString(cashFlow);
                bw.write(str1+"	"+str2+"
    ");
                bw.flush();
                bw.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    日志文件:

    1.2将接口与实现分离:将接口与实现分离允许实现的替代,可以支持各种测试目的。(官方版)

    (个人实例)接口类

     使用接口能尽可能地减少代码的改动,在保证参数不变的情况下,尽可能少的改动代码,将代码模块化。

    (个人理解)接口化在我写代码的时候还是比较常用的,因为现在代码量逐渐增多,仅在一个main函数里写下所有操作已经是不切实际的了,所以我们就需要将代码整体层次化,结构化,模式化,当代码有了层次,有了结构时,代码就会被分成各个函数单元,模块,这样既方便了测试,又方便了修改,可以大大降低后期维护费用。

    public interface VirtualCont {
        //定义接口,将接口与实现分离
        public double getDiscountFactor();
        public double[] getCashFlow();
        public double countNPV(double discountFactor, double[] cashFlow);
        public void getCanshu();
    }

    实现类

    接口调用:

    VirtualCont virtualCont = new RealCont();
            
            double DiscountFactor = 0;
            double[] CashFlow = null;
            //接口调用
            DiscountFactor = virtualCont.getDiscountFactor();
            CashFlow = virtualCont.getCashFlow();
            double NPV = virtualCont.countNPV(DiscountFactor, CashFlow);

    1.3特化访问路线/接口

    特化的接口可以独立于程序正常运行,即设计独立的接口仅供测试使用(官方版)

    (个人理解)特化接口同样可以在程序内部运行,但是带有特殊的参数,必须带有这个特殊的参数才能访问的接口/路线,再查看了同学的代码后,确实post和get函数是一个不错的例子,当时我不知为啥没有想到,可能是最近servlet用的比较少吧,但是我自己写的例子确实没有问题的,特定的参数,访问特定的函数/路线。

    特化接口:

    //访问特化接口
            VirtualCont vt = new RealCont();
            vt.getCanshu("special");
    
    
    
    //特化接口实现
       public void getCanshu(String str) {
            // TODO Auto-generated method stub
            if(str.equals("special")) {
                String path = "C:\Users\hp\Desktop\数据\test\canshu.log";
                File file =new File(path);
                FileReader fr;
                try {
                    fr = new FileReader(file);
                    BufferedReader br = new BufferedReader(fr);
                    System.out.println("读取到的数据为");
                    while(br.ready()) {
                        System.out.println(br.readLine());
                    }
                    
                    br.close();
                    fr.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }

    可以读到数据,并且独立于主程序运行

    2.内部监视

    随时查看软件的状态,性能负载,容量,安全性等一系列运行指标,在超出指标时给予警报或暂停运行,(官方版)

     (个人理解)当时在想这个问题的时候去度娘了好久都没有找到合适的出口,一直都是官方解释,所以无可奈何之下,自己写了这个,当时灵机一动,觉得检测值得输入是否为正确格式不失为一个好例子,就像我们在注册qq时,密码的要求是6-16为字母数字字符的组合,但是他没有说特殊字符,但是在你输入的时候,他会提醒不允许特殊字符(貌似,qq没有其他的也有),这个就是嵌在代码内部的一个监视输入的例子,所以我就小小写了一个简单的监视输入值的范围(不包括特殊字符,不易理解)。

    (个人实例)

    例如,输入错误及时提醒

    System.out.print("输入贴现率(0<r<1):");
            double DiscountFactor = scan.nextDouble();
            while(DiscountFactor>=1||DiscountFactor<=0) {
                if(DiscountFactor>=1) {
                    System.out.print("输入贴现率过大,请重新输入:");
                    DiscountFactor = scan.nextDouble();
                }else {
                    System.out.print("输入贴现率过小,请重新输入:");
                    DiscountFactor = scan.nextDouble();
                }
                
            }

     规避了一定的错误。

    更改到此结束,以上除了标注官方版的其他都是本人亲思亲敲(包括代码)!!!!!!

  • 相关阅读:
    Docker学习笔记
    Linux学习笔记
    C#
    30分钟掌握 C#7
    30分钟掌握 C#6
    Redmine部署到Windows Azure
    关于企业管理系统集成那些事
    变量内存分配知多少
    流行Java IDE工具大比拼[转]
    pgpool 流复制主从安装与配置(高可用、读写分离)[转]
  • 原文地址:https://www.cnblogs.com/msdog/p/12388647.html
Copyright © 2020-2023  润新知