问题:有一个方法,其功能为连接一个web地址(资源),
public String getContent (URL url)
{
url.openConnect();
}
测试的问题:(以下代码不包括import的包)
1 既然是关于web的测试,就需要一个web服务器,选择:建立一个如TOMCAT的服务器,还是用嵌入式的服务器,如jetty。
分析:鉴于只是一个单元测试,我们考虑用jetty。
2 url连接的资源,是给一个静态的文件,还是作些动态的处理?
分析:动态的处理比较灵活,采用这个方案。在jetty中,就是用生成一个处理器来动态处理来自url的信息。
由上可以构造如下:
public class TestWebClientSkeleton extends TestCase
{
protected void setUp()
{
//启动jetty
}
protected void tearDown()
{
//停止jetty
}
public void testGetContentOk() throws Exception
{
WebClient client = new WebClient();
String result = client.getContent( new URL(
"http://localhost:8081/testGetContentOk" ));
assertEquals( "It works", result );
}
}
3 如上可见:如果有多个关于WEB的测试,则每次测试都要启动和停止一次jetty,所以用一个TestSetup类,将一堆测试整合为一个suite,对次suite有一个setup,teardown方法,即对所有的测试只有一个setup ,teardown。如下:
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 );
server.start();
}
protected void tearDown() throws Exception
{
server.stop();
}
private class TestGetContentOkHandler extends AbstractHttpHandler
{
public void handle(String pathInContext, String pathParams,
HttpRequest request, HttpResponse response)
throws IOException
{
OutputStream out = response.getOutStream();
ByteArrayIOS8859Writer writer = new ByteArrayIOS8859Writer();
writer.write("It works");
writer.flush();
response.setIntField(HttpFields._ContentLength, writer.size() );
writer.writeTo( out );
out.flush();
request.setHandled( true );
}
}
}
测试类如下:
public class TestWebClient1 extends TestCase
{
public static Test suite()//显示地创建一个suite,并返回 一个包含对该suite中的所有测试通用的fixture的 //TestSetup,(将它视为一个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 );
}
}
/***********************************************************************************/
关于TestSetup:
实现了Test接口。
专门用来setUp和tearDown的,
以Test为构造器参数。
创建TestSetup的子类,继承setUp和tearDown,在其中完成额外的初始化和结束化工作。
初始化工作只在所有test进行前执行一次,
结束化工作只在所有test完成之后执行一次。
/***********************************************************************************/
public String getContent (URL url)
{
url.openConnect();
}
测试的问题:(以下代码不包括import的包)
1 既然是关于web的测试,就需要一个web服务器,选择:建立一个如TOMCAT的服务器,还是用嵌入式的服务器,如jetty。
分析:鉴于只是一个单元测试,我们考虑用jetty。
2 url连接的资源,是给一个静态的文件,还是作些动态的处理?
分析:动态的处理比较灵活,采用这个方案。在jetty中,就是用生成一个处理器来动态处理来自url的信息。
由上可以构造如下:
public class TestWebClientSkeleton extends TestCase
{
protected void setUp()
{
//启动jetty
}
protected void tearDown()
{
//停止jetty
}
public void testGetContentOk() throws Exception
{
WebClient client = new WebClient();
String result = client.getContent( new URL(
"http://localhost:8081/testGetContentOk" ));
assertEquals( "It works", result );
}
}
3 如上可见:如果有多个关于WEB的测试,则每次测试都要启动和停止一次jetty,所以用一个TestSetup类,将一堆测试整合为一个suite,对次suite有一个setup,teardown方法,即对所有的测试只有一个setup ,teardown。如下:
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 );
server.start();
}
protected void tearDown() throws Exception
{
server.stop();
}
private class TestGetContentOkHandler extends AbstractHttpHandler
{
public void handle(String pathInContext, String pathParams,
HttpRequest request, HttpResponse response)
throws IOException
{
OutputStream out = response.getOutStream();
ByteArrayIOS8859Writer writer = new ByteArrayIOS8859Writer();
writer.write("It works");
writer.flush();
response.setIntField(HttpFields._ContentLength, writer.size() );
writer.writeTo( out );
out.flush();
request.setHandled( true );
}
}
}
测试类如下:
public class TestWebClient1 extends TestCase
{
public static Test suite()//显示地创建一个suite,并返回 一个包含对该suite中的所有测试通用的fixture的 //TestSetup,(将它视为一个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 );
}
}
/***********************************************************************************/
关于TestSetup:
实现了Test接口。
专门用来setUp和tearDown的,
以Test为构造器参数。
创建TestSetup的子类,继承setUp和tearDown,在其中完成额外的初始化和结束化工作。
初始化工作只在所有test进行前执行一次,
结束化工作只在所有test完成之后执行一次。
/***********************************************************************************/