JUnit In Action 学习笔记

原创 2007年10月15日 16:46:00

 (1)回归测试----在已经存在的代码中加入新的代码时以保证代码仍然能够正常运行的测试叫回归测试(regression test)。

(2)Ant

// P124页
// 后面还有一个生成 xml 格式的 report 说明
// 自动找出要运行的测试

// 给项目命名,并设定黙认目标以便测试
<project name="sampling" default="test">

 // 你包含一个 build.properties 文件
 // 这个文件包括由于依赖于执行文件而必须在用户的系统上改变的 Ant 属性。
 <property file="build.properties" />

 <property name="src.dir" location="src" />
 <property name="src.java.dir" location="${src.dir}/java" />
 <property name="src.test.dir" location="${src.dir}/test" />
 
 <property name="target.dir" location="target" />
 <property name="target.classes.java.dir" location="${target.dir}/classes/java" />
 <property name="target.classes.test.dir" location="${target.dir}/classes/test" />
 

 // 定义一个名为 compile.java 的目标来编译 java 产品源码
 <target name="compile.java">
  
  // 保证产生产品类文件的目录存在
  <mkdir dir="${target.classes.java.dir}" />

  // 调用 java 编译器(javac)并且传给它目标目录
  <javac destdir="${target.classes.java.dir}">

   // 告诉 javac 需要编译的源码在哪
   <src path="${src.java.dir}" />
  </javac>
 </target>

 // 目标 compile.test 依赖于目标 compile.java
 <target name="compile.test" depends="compile.java">
  <mkdir dir="${target.classes.test.dir}" />
  <javac destdir="${target.classes.test.dir}">
   <src path="${src.test.dir}" />

   // 你得添加一条嵌套的 classpath 元素
   <classpath>
    <pathelement location="${target.classes.java.dir}" />
   </classpath>
  </javac>
 </target>

 // 创建一个自动调用目标 compile.java 和 compile.test 编译目标
 <target name="compile" depends="compile.java,compile.test" />


 // 构建文件的 test 目标
 // 如果你让 Ant 运行测试目标,它会先运行编译目标
 <target name="test" depends="compile">
 
  // printsummary 属性表明在测试的最后一行输出一个单行的概要
  // 通过把 fork 设为 yes,你强制 Ant 对每个测试分别使用一个单独的 java 虚拟机(JVM)
  // 属性 haltonerror 和 haltonfailure 表明如果失败或产生错误将停止编译
  <junit printsummary="yes" haltonerror="yes" haltonfailure="yes" fork="yes">

   // 配置 junit 任务格式器,用纯文本并且输出文本到控制台
   <formatter type="plain" usefile="false" />

   <test name="junitbook.sampling.TestDefaultController" />
   <classpath>
    <pathelement location="${target.classes.java.dir}" />
    <pathelement location="${target.classes.test.dir}" />
   </classpath>
  </junit>
 </target>


</project>

(3)stub 可以用来代替文件系统、到服务器的连接、数据库等。mock objects 可以用来代替单一的类

(4)Jetty

package edu.dhu.zkl.jetty;

import org.mortbay.http.HttpContext;
import org.mortbay.http.HttpServer;
import org.mortbay.http.SocketListener;
import org.mortbay.http.handler.ResourceHandler;

public class JettySample {
 public static void main(String[] args) throws Exception {
  HttpServer server = new HttpServer();
  SocketListener listener = new SocketListener();
  listener.setPort(8081);
  server.addListener(listener);
  
  HttpContext context = new HttpContext();
  context.setContextPath("/");
  context.setResourceBase("./");
  context.addHandler( new ResourceHandler() );
  server.addContext(context);
  
  server.start();
 }
}

运行这个程序,然后在浏览器输入 http://localhost:8081/ 就可以看到项目下的所有资源。

(5)用 Jetty 来演示一个 Stub 的测试(注意加入 servelt-api.jar 和 jetty.jar )

两个类,一个 TestWebClientSetup1 用来内嵌 Jetty 服务器,另一个 TestWebClient1 简单的测试案例

package edu.dhu.zkl.jetty.test;

import java.io.IOException;
import java.io.OutputStream;

import junit.extensions.TestSetup;
import junit.framework.Test;

import org.mortbay.http.HttpContext;
import org.mortbay.http.HttpFields;
import org.mortbay.http.HttpRequest;
import org.mortbay.http.HttpResponse;
import org.mortbay.http.HttpServer;
import org.mortbay.http.SocketListener;
import org.mortbay.http.handler.AbstractHttpHandler;
import org.mortbay.http.handler.NotFoundHandler;
import org.mortbay.util.ByteArrayISO8859Writer;

public class TestWebClientSetup1 extends TestSetup {
 protected static HttpServer server;
 
 public TestWebClientSetup1(Test suite) {
  super(suite);
 }
 
 protected void setUp() throws Exception {
  server = new HttpServer();
  SocketListener listener = new SocketListener();
  listener.setPort(8081);
  server.addListener(listener);
  
  HttpContext context1 = new HttpContext();
  context1.setContextPath("/testGetContentOk");
  context1.addHandler(new TestGetContentOkHandler());
  server.addContext(context1);
  
  HttpContext context2 = new HttpContext();
  context2.setContextPath("/testGetContentNotFound");
  context2.addHandler(new NotFoundHandler());
  server.addContext(context2);
  
  HttpContext context3 = new HttpContext();
  context3.setContextPath("/testGetContentServerError");
  context3.addHandler(new TestGetContentServerErrorHandler());
  server.addContext(context3);
  
  server.start();
 }
 
 protected void tearDown() throws Exception {
  server.stop();
 }
 
 private class TestGetContentOkHandler extends AbstractHttpHandler {
  /**
   *
   */
  private static final long serialVersionUID = 1L;

  public void handle( String pathInContext, String pathParams,
    HttpRequest request, HttpResponse response ) throws IOException {
   OutputStream out = response.getOutputStream();
   ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer();
   writer.write("It works");
   writer.flush();
   response.setIntField( HttpFields.__ContentLength, writer.size() );
   writer.writeTo(out);
   out.flush();
   request.setHandled(true);
  }
 }
 
 private class TestGetContentServerErrorHandler extends AbstractHttpHandler {
  /**
   *
   */
  private static final long serialVersionUID = 1L;

  public void handle(String pathInContext, String pathParams,
    HttpRequest request, HttpResponse response ) throws IOException {
   response.sendError(HttpResponse.__503_Service_Unavailable);
  }
 }
}

package edu.dhu.zkl.jetty.test;

import java.net.URL;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import edu.dhu.zkl.jetty.WebClient;

public class TestWebClient1 extends TestCase {
 public static Test suite() {
  TestSuite suite = new TestSuite();
  suite.addTestSuite(TestWebClient1.class);
  
  return new TestWebClientSetup1(suite);
 }
 
 public void testGetContentOk() throws Exception {
  WebClient client = new WebClient();
  
  String result = client.getContent(new URL(
    "http://localhost:8081/testGetContentOk" ) );
  
  assertEquals( "It works", result );
 }
 
 public void testGetContentNotFound() throws Exception {
  WebClient client = new WebClient();
  
  String result = client.getContent(new URL(
    "http://localhost:8081/testGetContentNotFound" ) );
  
  assertNull(result);
 }
 
 public void testGetContentServerError() throws Exception {
  WebClient client = new WebClient();
  
  String result = client.getContent(new URL(
    "http://localhost:8081/testGetContentServerError" ) );
  
  assertNull(result);
 }
}

还有一个 WebClient 类,被测类

package edu.dhu.zkl.jetty;

import java.net.URL;
import java.net.HttpURLConnection;
import java.io.InputStream;
import java.io.IOException;

public class WebClient
{
    public String getContent(URL url)
    {
        StringBuffer content = new StringBuffer();

        try
        {
            HttpURLConnection connection =
                (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);

            InputStream is = connection.getInputStream();

            byte[] buffer = new byte[2048];
            int count;
            while (-1 != (count = is.read(buffer)))
            {
                content.append(new String(buffer, 0, count));
            }
        }
        catch (IOException e)
        {
            return null;
        }

        return content.toString();
    }
}

(6)

 

StrutsTestCase配置的常见问题及其多级Action的处理方式

StrutsTestCase的配置的常见问题及其简单的测试用例
  • simon_world
  • simon_world
  • 2014年11月19日 22:26
  • 1286

spring mvc 给action添加事务不成功的原因

Java代码              contextConfigLocation           classpath*:META-INF/spring/applicationC...
  • z69183787
  • z69183787
  • 2014年07月15日 16:52
  • 3254

Junit使用教程(一)

几乎所有程序员都听说过Junit的大名,但不知真正懂得运用它的人有多少,我便是其中的一个小白。 知道Junit是用来测试的,但却把“宝刀”当成了“菜刀”用。为了从此不再菜鸟,特此总结整理了下Juni...
  • wangpeng047
  • wangpeng047
  • 2013年07月30日 15:09
  • 57365

Sring MVC 环境下的Shiro集成测试

由于在Service层通过annotation限定了访问权限,并且需要根据用户权限进行业务数据过滤,因此shiro官方提供的方案实现不了。如果只是简单的需求,可以参照官方文档。 # shiro配置 为...
  • zmzmmf
  • zmzmmf
  • 2014年04月02日 09:42
  • 766

JUnit之参数化测试和成组测试的使用

JUnit之参数化测试和成组测试的简单使用
  • yqj2065
  • yqj2065
  • 2014年10月10日 20:09
  • 5423

junit --Eclipse下的环境搭建

大体的步骤    创建project    添加junit包    创建一个待测试的类JDemo.java    为JDemo.java创建一个Junit测试用例JDemoTest.java ...
  • guanning0109
  • guanning0109
  • 2014年05月05日 10:59
  • 7315

使用JUnit测试预期异常

开发人员常常使用单元测试来验证的一段儿代码的操作,很多时候单元测试可以检查抛出预期异常( expected exceptions)的代码。在Java语言中,JUnit是一套标准的单元测试方案,它提供了...
  • tayanxunhua
  • tayanxunhua
  • 2014年03月05日 21:35
  • 16138

JUnit 4.8 源码解读

JUnit 4.8 源码解读,大体讲述了test case的执行顺序
  • zhengzf90
  • zhengzf90
  • 2016年07月02日 17:43
  • 921

JUnit测试失败的两种原因

测试用例不是用来证明你是对的,而是用来证明你没有错。 1.Failure一般由单元测试使用的断言方法判断失败所引起的,这经表示 测试点发现了问题 ,就是说程序输出的结果和我们预期的不一样。 2...
  • Chenyt01
  • Chenyt01
  • 2016年05月17日 23:32
  • 5574

JUnit---(断言和注解)

本文原地址为:http://blog.csdn.net/wangpeng047/article/details/9628449 一、核心——断言 断言是编写测试用例的核心实现方式,即期望值是多少...
  • u014042146
  • u014042146
  • 2015年10月28日 11:00
  • 1771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JUnit In Action 学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)