首先可测试性指的是可测试性战术的目标是允许在完成软件开发的一个增量后,轻松的对软件进行测试。
测试的目标是发现错误。
首先具有可测试性的代码有如下几点特点
1. 控制性。
控制性是指测试者给在被测试的软件提供固定的输入数据的方便程度。换句话说就是软件本身接受定义明确的参数,并且这些参数可由测试者灵活的传入,软件在接受到这些参数后通过一系列运算返回固定的结果。任何软件都应该清楚的表明自己需要什么参数,以及将会生成什么返回值。此外任何软件都应该应该抽象它的依赖,譬如参数或底层模块,并为外部调用者提供随意注入的方式。当然软件代码本身应该清晰,整洁,目标明确.
2.可见性。
可见性是指测试者观察正在测试的软件的当前状态以及它所产生的任何输出的能力。换句话说就是软件应该将内部运算的状态(一般是指错误状态)和输出结果清晰明确的告知测试者。可见性一般都是通过方法执行后验证后置条件完成。
验证后置条件与契约式设计有关。所谓的契约式设计,是指把组件之间的交互描述成契约,权利和义务得到明确的表达和强制实施。在.net环境下,可以通过.net Framework4新增的Code Contracts库创建软件契约。
3.简约性。
一般而言,简约性对任何系统在任何情况下都是一个正面的属性,测试毫无疑问也不例外。简单和极其内聚的组件非常适合测试,因为他们暴露出来的方法少,需要的测试也就少,而需要的测试越少,就越能做得可靠,快速.
结合信息领域热词分析系统进行验证
1.对系统新加一个增量,正确的显示是系统没有此选项,但是系统显示null为空。
经过检查发现是相关的代码未加内容提示,
private void Select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); HttpSession session=req.getSession(); PrintWriter out=resp.getWriter(); System.out.println("AAAAAAAAAAAAA"); String select_name = req.getParameter("select_name"); InfoBean Bean=new InfoBean(); Bean=InfoDao.select_baike_info("baike_list_num", select_name); String url=""; url=InfoDao.select_baike_blogs_ci(select_name); if(!url.equals("")) { System.out.println("Name"); System.out.println(url); Bean.setUrl(url); }else { url=InfoDao.select_baike_blogs_title(select_name); if(!url.equals("")) { System.out.println("Title"); System.out.println(url); Bean.setUrl(url); }else { url=InfoDao.select_baike_blogs_info(select_name); if(!url.equals("")) { System.out.println("Info"); System.out.println(url); Bean.setUrl(url); } }
经过代码进行检查修改,对查找姓名函数上加上有关提示。
接口分离
有了标准的接口,进行有效的隔离,能够极大程度的减少测试员的工作量,模块化测试,单元测试极大地减少了测试过程中用例的原则,如果没有接口隔离,不管用的是极值分析法还是等价划分法,都对测试员的工作造成了极大的负担,相对而言,单元测试更加简化了工作量,让白盒测试过程中的逻辑复杂度降低了不少。
通过使用ajax动态调取servlet,servlet再和dao层代码联系,最后实现数据库查询,操作,再将数据返回ajax
<script type="text/javascript"> $.ajax({ type : "post", async : true, url : "${pageContext.request.contextPath}/InfoServlet", type:"POST", data: { "method":"select" }, dataType:"json", success:function(data) { $.each(data,function(index) { $(".results").append("<blockquote>"+data[index].Name+"<cite> – "+data[index].Info+"</cite></blockquote>"); }); }, error : function(errorMsg) { //请求失败时执行该函数 alert("请求数据失败!"); } }); </script>
2.内部监视
一旦一个线程锁住对象,该对象就成为监视器。加锁是通过在方法或块上使用synchronized关键字来实现的。可以对监视器调用wait()方法来释放锁,这样其他的一些监视器中的线程就可以获取它,也就有可能改变监视器中的状态。
package com.bwie.test; /* * 自定义异常 必须继承Exception 或者其子类 * */ public class MyException extends Exception { public MyException(String message) { super(message); } public MyException(){ } //测试方法 public static void main(String[] args) { MyException test=new MyException(); try{ test.createDoubleArray(-10); }catch(MyException ex){ ex.printStackTrace(); } } //自定义异常方法 public double[] createDoubleArray(int length)throws MyException{ if(length<0){ throw new MyException("数组的长度不能小于0"); } return new double[length]; } }