代码层描述质量属性可测试性(由于上次的个人理解过于官方简短,导致。。重新编辑)
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(); } }
规避了一定的错误。
更改到此结束,以上除了标注官方版的其他都是本人亲思亲敲(包括代码)!!!!!!