可测试性战术的目标是允许在完成软件开发的一个增量后,较轻松地对软件进行测试。
软件的可测试性是指软件发现故障并隔离、定位其故障的能力特性,以及在一定的时间和成本前提下,进行测试设计、测试执行的能力。James Bach 这样描述可测试性:软件可测试性就是一个计算机程序能够被测试的容易程度。
首先具有可测试性的代码有如下几点特点
1. 控制性。
控制性是指测试者给在被测试的软件提供固定的输入数据的方便程度。换句话说就是软件本身接受定义明确的参数,并且这些参数可由测试者灵活的传入,软件在接受到这些参数后通过一系列运算返回固定的结果。任何软件都应该清楚的表明自己需要什么参数,以及将会生成什么返回值。此外任何软件都应该应该抽象它的依赖,譬如参数或底层模块,并为外部调用者提供随意注入的方式。当然软件代码本身应该清晰,整洁,目标明确.
2.可见性。
可见性是指测试者观察正在测试的软件的当前状态以及它所产生的任何输出的能力。换句话说就是软件应该将内部运算的状态(一般是指错误状态)和输出结果清晰明确的告知测试者。可见性一般都是通过方法执行后验证后置条件完成。
验证后置条件与契约式设计有关。所谓的契约式设计,是指把组件之间的交互描述成契约,权利和义务得到明确的表达和强制实施。在.net环境下,可以通过.net Framework4新增的Code Contracts库创建软件契约。
3.简约性。
一般而言,简约性对任何系统在任何情况下都是一个正面的属性,测试毫无疑问也不例外。简单和极其内聚的组件非常适合测试,因为他们暴露出来的方法少,需要的测试也就少,而需要的测试越少,就越能做得可靠,快速.
内部监视
组件可以根据内部状态实现战术,以支持测试过程
内置监视器。组件可以维持状态,性能负载,容量,安全性或其他可通过接口访问的信息
一个常见的技巧就是当监视状态被激活时记录事件。监视状态实际上会增加测试工作,因为随着监视的关闭。可能必须重复测试。尽管额外测试需要一等的开销,但这却使组件活动的可见性得以提高,这样做是值得的连接数据库时可以监视数据库的连接状态。
package util;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBUtil {
private static String Driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/reci?useUnicode=true&characterEncoding=utf8";
private static String user = "root";
private static String psd = "root";
private static Connection conn = null;
// 连接数据库
public static Connection getConnection() {
if (conn == null) {
try {
Class.forName(Driver);
conn = DriverManager.getConnection(url, user, psd);
System.out.println("开始数据库连接");
} catch (Exception e) {
e.printStackTrace();
}
}
return conn;
}
// 关闭数据库连接
public static void CloseConnection() {
if (conn != null) {
try {
conn.close();
System.out.println("关闭数据库连接");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
管理测试的输入和输出的战术:
1.记录/回放
记录/回放是指捕获跨接口的信息,并将其作为测试专用软件的输入。在正常操作中跨一个接口的信息保存在某个存储库中,他代表来自一个组件的测试输出和传到一个组件的输入。记录该信息使得能够生成对其中一个组件的测试输入,并保存用于以后的比较的测试输出。
2.将接口与实现分离
用ajax调取servlet,servlet和dao层联系,将json数据返回ajax
function show(){ $.ajax({ type: "GET", url: "UserServlet?action=list", dataType: "json", success: function(result){ var users = eval(result.users); //加载数据前先置空数组 for(var i in users){ //alert(users[i].keyword+"---"+users[i].pinlv); data.push({name:users[i].keyword,value:users[i].pinlv}); } //显示返回值 //document.write(data[0].value); option = { tooltip: {}, series: [ { type: 'wordCloud', gridSize: 2, sizeRange: [12, 50], // rotationRange: [0, 90], shape: 'star', // 600, //height: 400, textStyle: { normal: { color: function () { return 'rgb(' + [ Math.round(Math.random() * 160), Math.round(Math.random() * 160), Math.round(Math.random() * 160) ].join(',') + ')'; } }, emphasis: { shadowBlur: 10, shadowColor: '#333' } }, data:data } ] }; myChart.setOption(option); } }); }
3.特化访问路线/接口
具有特化的测试接口允许通过测试工具并独立于其正常操作,来捕获或指定组件变量的值,组件可以根据内部状态实现战术,以支持测试过程。
get请求,post请求
用get请求请求数据,从数据库中返回
function show(){ $.ajax({ type: "GET", url: "UserServlet?action=list", dataType: "json", success: function(result){ var users = eval(result.users); //加载数据前先置空数组 for(var i in users){ //alert(users[i].keyword+"---"+users[i].pinlv); data.push({name:users[i].keyword,value:users[i].pinlv}); }