尝试翻译JRUnit的文档(四)

本文介绍如何使用jrUnit框架进行客户端/服务器(C/S)测试,包括配置测试类、运行多客户端测试及获取基准测试结果等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继续上次的....

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,要仔细看了示例代码估计才能搞懂)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值