继续上次的....
clientserver
下一个例子是关于在junit框架下运行C/S测试引发的一些问题,以及jrunit是如何解决这些问题的,相关代码位于org.jboss.jrunit.sample.clientserver包。原来的测试类SimpleServerTest只要做些简单的改动就可以了——父类从原来的junit.framework.TestCase换成org.jboss.jrunit.ServerTestCase,新的父类可以改变server test运行时的行为(不清楚的读者可以参考ServerTestCase这一章以获得更多关于这个类如何改变server test行为的细节)
public class SimpleServerTest extends ServerTestCase // NOTE: Not TestCase, but ServerTestCase 注意,不是TestCase, 而是ServerTestCase
{
...
此外还要把System.out.println改为log4j用作日志记录,因为(在本例中)不输出到控制台,更主要是因为这段测试会运行差不多一分钟(译注:C/S测试需要运行一段时间,单纯输出到命令行控制台不方便查看)。org.jboss.jrunit.sample.clientserver包里面另一个类是SampleClientServerTest,这个类继承自org.jboss.jrunit.harness.TestDriver,可以提供harness用于在不同进程上运行客户端和服务器测试。
public class SampleClientServerTest extends TestDriver
{
public void declareTestClasses()
{
addTestClasses("org.jboss.jrunit.sample.basic.SimpleClientTest",1,
"org.jboss.jrunit.sample.clientserver.SimpleServerTest");
}
protected Level getTestHarnessLogLevel()
{
return Level.DEBUG;
}
}
我们主要研究一下declareTestClasses()方法,这个方法在TestDriver中是抽象类,所以必须要实现它。然后调用TestDriver类中的addTestClasses()方法。传递给addTestClasses方法的参数按顺序依次是:要运行的client test类,要生成的客户端进程数,以及要运行的server test类。注意,这里的client test类是上一个例子的org.jboss.jrunit.sample.basic.SimpleClientTest,而server test类则是继承自ServerTestCase的org.jboss.jrunit.sample.clientserver.SimpleServerTest
还有一个getTestHarnessLogLevel()方法,用来告诉driver为test harness代码和debug设置怎样的日志等级。要运行这个实例,请到根目录下用ant运行run-SampleClientServerTest,控制台会输出类似下面的信息:
run-SampleClientServerTest:
[junit] Running org.jboss.jrunit.sample.clientserver.SampleClientServerTest
[junit] Tests run: 1, Failures: 2, Errors: 0, Time elapsed: 10.045 sec
[junit] Test org.jboss.jrunit.sample.clientserver.SampleClientServerTest FAILED
[junitreport] Transform time: 471ms
这个ant任务会在output/test-report/目录下创建一个html格式的报告。从上面的结果知道,出现了两个failure,第一个failure源自org.jboss.jrunit.sample.basic.SimpleClientTest类的testFailure()方法,另一个是源自org.jboss.jrunit.sample.clientserver.SimpleServerTest类的testRequestCount方法(因为只收到了一个客户端的调用,而不是30个)。
multiple client server
本实例是基于上一个实例的,不过现在有三个客户端进程一起调用服务器。本实例只有一个新的类,叫做org.jboss.jrunit.sample.multipleclientserver.SampleMultipleClientServerTest
public class SampleMultipleClientServerTest extends TestDriver
{
public void declareTestClasses()
{
addTestClasses("org.jboss.jrunit.sample.basic.SimpleClientTest",
3,
"org.jboss.jrunit.sample.clientserver.SimpleServerTest");
}
}
这个类和先前的SampleClientServerTest的差别在于addTestClassses()方法的第二个参数从1变成3。同样要运行这个实例,同样必须在根目录下用ant运行run-SampleMultipleClientServerTest。控制台输出类似如下:
run-SampleMultipleClientServerTest:
[junit] Running org.jboss.jrunit.sample.multipleclientserver.SampleMultipleClientServerTest
[junit] Tests run: 1, Failures: 4, Errors: 0, Time elapsed: 11.577 sec
[junit] Test org.jboss.jrunit.sample.multipleclientserver.SampleMultipleClientServerTest
FAILED [junitreport] Transform time: 511ms
这个ant任务同样在output/test-report/目录下创建一个html报告,现在看看输出的结果,有四个Failure。第一个源自org.jboss.jrunit.sample.basic.SimpleClientTest类的testFailure()方法,而第四个源自org.jboss.jrunit.sample.clientserver.SimpleServerTest类的testRequestCount()方法(因为只收到一个客户端的调用而不是三十个)。这也意味着那三个SimpleClientTest的 testClientCall()方法都成功运行了。
client only
当服务器端已经在运行时,使用jrunit框架也可以只运行客户端测试。想要这样做,就按照org.jboss.jrunit.sample.clientonly.SampleClientOnlyTest的方式,把addTestClasses()方法的最后一个参数改为null
public class SampleClientOnlyTest extends TestDriver
{
public void declareTestClasses()
{
addTestClasses("org.jboss.jrunit.sample.basic.SimpleClientTest",3,null);
}
}
想要运行这个测试,先运行org.jboss.jrunit.sample.basic.SimpleServerTest,然后运行org.jboss.jrunit.sample.clientonly.SampleClientOnlyTest。记住,这种情况下SimpleServerTest只能手动关闭,最后的运行结果应该和上一个例子一样,只是不再有来自SimpleServerTest的failure了。
decorated client server
这个实例与之前的C/S实例非常相似,只是客户端变成了org.jboss.jrunit.sample.decoratedclientserver.SimpleDecoratedClientTest。这个类的代码与之前的SimpleClientTest相同,不过增加了一些代码,那样除了junit基本测试结果以外,还能得到benchmark结果。
...
public static Test suite()
{
return new ThreadLocalDecorator(SimpleDecoratedClientTest.class, 10);
}
public void testClientCall() throws Exception
{
// start benchmark tracking
ThreadLocalBenchmark.openBench("ClientCall");
ThreadLocalBenchmark.openBench("GetSocket");
getSocket();
ThreadLocalBenchmark.closeBench("GetSocket");
/**
* Uncomment this to see that is the same object, thread, and socket for each loop,
* but will be different for each thread as specified to the test decorator. This
* is based on the values passed to JunitThreadDecorator (or one of it's subclasses)
* for the numberOfThreads and loop parameter values.
*/
//System.out.println(hashCode() + " - " + Thread.currentThread().getName() + " - " + socket.hashCode());
oos.writeObject("This is the request from " + Thread.currentThread().getName());
oos.reset();
oos.writeObject(Boolean.TRUE);
oos.flush();
oos.reset();
Object obj = objInputStream.readObject();
objInputStream.readObject();
assertEquals("This is response.", obj);
ThreadLocalBenchmark.closeBench("ClientCall");
}
不同之处主要在于新加了一个suite方法,用于创建一个新的ThreadLocalDecorator实例,告诉客户端应当循环执行10次。在testClientCall()方法中也加了几行,通过对ThreadLocalBenchmark的一些静态方法的调用,定义了benchmark metrics什么时候开始,什么时候结束。要了解更多关于ThreadLocalBenchmark的细节,请参考ThreadLocalBenchmark的章节。SampleDecoratedClientServerTest继承自BenchmarkTestDriver,而不是TestDriver。这样可以启动一个根test driver,用来监听远程的benchmark结果并将其发送至控制台和一个本地文件,文件名和这个test类的名字相关(例如,SampleDecoratedClientServerTest_benchmark.txt)。
(翻译完第三章了,虽然有些地方不是很明白,比如那几个failure,要仔细看了示例代码估计才能搞懂)
clientserver
下一个例子是关于在junit框架下运行C/S测试引发的一些问题,以及jrunit是如何解决这些问题的,相关代码位于org.jboss.jrunit.sample.clientserver包。原来的测试类SimpleServerTest只要做些简单的改动就可以了——父类从原来的junit.framework.TestCase换成org.jboss.jrunit.ServerTestCase,新的父类可以改变server test运行时的行为(不清楚的读者可以参考ServerTestCase这一章以获得更多关于这个类如何改变server test行为的细节)
public class SimpleServerTest extends ServerTestCase // NOTE: Not TestCase, but ServerTestCase 注意,不是TestCase, 而是ServerTestCase
{
...
此外还要把System.out.println改为log4j用作日志记录,因为(在本例中)不输出到控制台,更主要是因为这段测试会运行差不多一分钟(译注:C/S测试需要运行一段时间,单纯输出到命令行控制台不方便查看)。org.jboss.jrunit.sample.clientserver包里面另一个类是SampleClientServerTest,这个类继承自org.jboss.jrunit.harness.TestDriver,可以提供harness用于在不同进程上运行客户端和服务器测试。
public class SampleClientServerTest extends TestDriver
{
public void declareTestClasses()
{
addTestClasses("org.jboss.jrunit.sample.basic.SimpleClientTest",1,
"org.jboss.jrunit.sample.clientserver.SimpleServerTest");
}
protected Level getTestHarnessLogLevel()
{
return Level.DEBUG;
}
}
我们主要研究一下declareTestClasses()方法,这个方法在TestDriver中是抽象类,所以必须要实现它。然后调用TestDriver类中的addTestClasses()方法。传递给addTestClasses方法的参数按顺序依次是:要运行的client test类,要生成的客户端进程数,以及要运行的server test类。注意,这里的client test类是上一个例子的org.jboss.jrunit.sample.basic.SimpleClientTest,而server test类则是继承自ServerTestCase的org.jboss.jrunit.sample.clientserver.SimpleServerTest
还有一个getTestHarnessLogLevel()方法,用来告诉driver为test harness代码和debug设置怎样的日志等级。要运行这个实例,请到根目录下用ant运行run-SampleClientServerTest,控制台会输出类似下面的信息:
run-SampleClientServerTest:
[junit] Running org.jboss.jrunit.sample.clientserver.SampleClientServerTest
[junit] Tests run: 1, Failures: 2, Errors: 0, Time elapsed: 10.045 sec
[junit] Test org.jboss.jrunit.sample.clientserver.SampleClientServerTest FAILED
[junitreport] Transform time: 471ms
这个ant任务会在output/test-report/目录下创建一个html格式的报告。从上面的结果知道,出现了两个failure,第一个failure源自org.jboss.jrunit.sample.basic.SimpleClientTest类的testFailure()方法,另一个是源自org.jboss.jrunit.sample.clientserver.SimpleServerTest类的testRequestCount方法(因为只收到了一个客户端的调用,而不是30个)。
multiple client server
本实例是基于上一个实例的,不过现在有三个客户端进程一起调用服务器。本实例只有一个新的类,叫做org.jboss.jrunit.sample.multipleclientserver.SampleMultipleClientServerTest
public class SampleMultipleClientServerTest extends TestDriver
{
public void declareTestClasses()
{
addTestClasses("org.jboss.jrunit.sample.basic.SimpleClientTest",
3,
"org.jboss.jrunit.sample.clientserver.SimpleServerTest");
}
}
这个类和先前的SampleClientServerTest的差别在于addTestClassses()方法的第二个参数从1变成3。同样要运行这个实例,同样必须在根目录下用ant运行run-SampleMultipleClientServerTest。控制台输出类似如下:
run-SampleMultipleClientServerTest:
[junit] Running org.jboss.jrunit.sample.multipleclientserver.SampleMultipleClientServerTest
[junit] Tests run: 1, Failures: 4, Errors: 0, Time elapsed: 11.577 sec
[junit] Test org.jboss.jrunit.sample.multipleclientserver.SampleMultipleClientServerTest
FAILED [junitreport] Transform time: 511ms
这个ant任务同样在output/test-report/目录下创建一个html报告,现在看看输出的结果,有四个Failure。第一个源自org.jboss.jrunit.sample.basic.SimpleClientTest类的testFailure()方法,而第四个源自org.jboss.jrunit.sample.clientserver.SimpleServerTest类的testRequestCount()方法(因为只收到一个客户端的调用而不是三十个)。这也意味着那三个SimpleClientTest的 testClientCall()方法都成功运行了。
client only
当服务器端已经在运行时,使用jrunit框架也可以只运行客户端测试。想要这样做,就按照org.jboss.jrunit.sample.clientonly.SampleClientOnlyTest的方式,把addTestClasses()方法的最后一个参数改为null
public class SampleClientOnlyTest extends TestDriver
{
public void declareTestClasses()
{
addTestClasses("org.jboss.jrunit.sample.basic.SimpleClientTest",3,null);
}
}
想要运行这个测试,先运行org.jboss.jrunit.sample.basic.SimpleServerTest,然后运行org.jboss.jrunit.sample.clientonly.SampleClientOnlyTest。记住,这种情况下SimpleServerTest只能手动关闭,最后的运行结果应该和上一个例子一样,只是不再有来自SimpleServerTest的failure了。
decorated client server
这个实例与之前的C/S实例非常相似,只是客户端变成了org.jboss.jrunit.sample.decoratedclientserver.SimpleDecoratedClientTest。这个类的代码与之前的SimpleClientTest相同,不过增加了一些代码,那样除了junit基本测试结果以外,还能得到benchmark结果。
...
public static Test suite()
{
return new ThreadLocalDecorator(SimpleDecoratedClientTest.class, 10);
}
public void testClientCall() throws Exception
{
// start benchmark tracking
ThreadLocalBenchmark.openBench("ClientCall");
ThreadLocalBenchmark.openBench("GetSocket");
getSocket();
ThreadLocalBenchmark.closeBench("GetSocket");
/**
* Uncomment this to see that is the same object, thread, and socket for each loop,
* but will be different for each thread as specified to the test decorator. This
* is based on the values passed to JunitThreadDecorator (or one of it's subclasses)
* for the numberOfThreads and loop parameter values.
*/
//System.out.println(hashCode() + " - " + Thread.currentThread().getName() + " - " + socket.hashCode());
oos.writeObject("This is the request from " + Thread.currentThread().getName());
oos.reset();
oos.writeObject(Boolean.TRUE);
oos.flush();
oos.reset();
Object obj = objInputStream.readObject();
objInputStream.readObject();
assertEquals("This is response.", obj);
ThreadLocalBenchmark.closeBench("ClientCall");
}
不同之处主要在于新加了一个suite方法,用于创建一个新的ThreadLocalDecorator实例,告诉客户端应当循环执行10次。在testClientCall()方法中也加了几行,通过对ThreadLocalBenchmark的一些静态方法的调用,定义了benchmark metrics什么时候开始,什么时候结束。要了解更多关于ThreadLocalBenchmark的细节,请参考ThreadLocalBenchmark的章节。SampleDecoratedClientServerTest继承自BenchmarkTestDriver,而不是TestDriver。这样可以启动一个根test driver,用来监听远程的benchmark结果并将其发送至控制台和一个本地文件,文件名和这个test类的名字相关(例如,SampleDecoratedClientServerTest_benchmark.txt)。
(翻译完第三章了,虽然有些地方不是很明白,比如那几个failure,要仔细看了示例代码估计才能搞懂)