long maxElapsedTime = 1000;
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test timedTest = new TimedTest(testCase, maxElapsedTime);
同样地,如果想要在执行过程如果超出预期时间立即结束本次测试可以在TimedTest构造函数中增加第三个参数,举例如下:
long maxElapsedTime = 1000;
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test timedTest = new TimedTest(testCase, maxElapsedTime, false);
以下代码创建了一个执行时间的测试,用来测试被定义在单元测试ExampleTestCase.testOneSecondResponse()方法所代表的功能执行的时间。
执行效率测试举例
import com.clarkware.junitperf.*;
import junit.framework.Test;
public class ExampleTimedTest {
public static Test suite() {
long maxElapsedTime = 1000;
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test timedTest = new TimedTest(testCase, maxElapsedTime);
return timedTest;
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
}
测试的粒度决定于JUnit的测试用例,并被JUnitPerf所使用,因此有一定的局限性。终获得的执行时间为测试用例中testXXX()方法的执行时间,包括setUp(), testXXX(), 和tearDown()方法的执行时间。执行测试套件的时间包含测试套件中所有测试示例的setUp(), testXXX(), 和tearDown()方法的执行时间。所以,预期的时间还应该依照set-up和tear-down的执行时间来制定(把这部分时间也考虑进去)。
LoadTest
LoadTest用来仿效多个用户并发执行多次来进行测试。
LoadTest简单的构造函数只有两个参数,测试用例和用户数,默认情况下该测试只迭代一次。
例如,创建一个10用户并发执行一次ExampleTestCase.testOneSecondResponse()方法:
int users = 10;
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test loadTest = new LoadTest(testCase, users);
负载测试过程也可以指定一个额外的计数器实例用来指定用户并发执行之间的延迟时间。ConstantTimer类构造函数包含一个常量参数,用来指定延迟时间,如果指定为0则表示所有的用户同时开始。RandomTimer类可以构造出随机的延迟时间。
例如:创建一个负载测试,10个并发用户各执行一次ExampleTestCase.testOneSecondResponse()方法,各个用户之间延迟1秒钟执行。
int users = 10;
Timer timer = new ConstantTimer(1000);
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test loadTest = new LoadTest(testCase, users, timer);
为了仿效并发用户以指定迭代次数执行测试,LoadTest类构造函数包含了RepeatedTest参数。这样可以为每个测试用例指定迭代次数了。
例如:创建一个负载测试,10个并发用户,每个用户迭代执行ExampleTestCase.testOneSecondResponse()方法20次,每个并发用户之间延迟1秒。
int users = 10;
int iterations = 20;
Timer timer = new ConstantTimer(1000);
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test repeatedTest = new RepeatedTest(testCase, iterations);
Test loadTest = new LoadTest(repeatedTest, users, timer);
或者这样来写:
int users = 10;
int iterations = 20;
Timer timer = new ConstantTimer(1000);
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test loadTest = new LoadTest(testCase, users, iterations, timer);
如果负载测试要求测试在setUp()方法中包含特殊的测试状态,那么应该使用TestFactory类来确保每个并发用户线程使用一个本地线程测试实例。例如创建一个10用户并发的测试,每个用户运行ExampleStatefulTest类的一个本地线程,可这样来写:
int users = 10;
Test factory = new TestFactory(ExampleStatefulTest.class);
Test loadTest = new LoadTest(factory, users);
如果测试其中的某一个方法,可以这样:
int users = 10;
Test factory = new TestMethodFactory(ExampleStatefulTest.class, "testSomething");
Test loadTest = new LoadTest(factory, users);