我在服务器套接字上有一个java服务器。客户端连接到这个服务器套接字,并通过输入/输出对象流交换。现在我需要测试应用程序的可扩展性。这意味着我需要运行相同的测试请求,并测试服务器是否能够处理来自随机客户端的请求。
下面基于junit的测试用例是测试随机连接/请求的正确方法吗?我有一种感觉,下面的代码是顺序地测试客户端。
我读了一些链接,但没有为我工作
创建一个带有多个参数化测试实例的JUnit测试套件
public class ScalePostiveTestCases {
SendQueue sendQueue;
Socket clientSocket = null;
public static void main(String[] args) throws Throwable {
testSearching() ;
}
@SuppressWarnings("unchecked")
private static void testSearching() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
TestSuite tests = new TestSuite();
for (int i = 0; i < 99; i++) {
Class<SingleSearchTest> singleSearchTest = (Class<SingleSearchTest>) ClassLoader
.getSystemClassLoader().loadClass(
"SingleSearchTest");
SingleSearchTest singleSearch = singleSearchTest.newInstance();
tests.addTest(singleSearch);
}
TestRunner.run(tests);
}
public class SingleSearchTest extends TestCase {
static SingleSearchTest singleSearch = null;
private String device, connection, user;
private ClientSession clientSession;
private SendQueue sendQueue;
public static SingleSearchTest main(String args[]) {
singleSearch = new SingleSearchTest();
return singleSearch;
}
public SingleSearchTest() {
super("testSingleSearch");
Random rand = new Random();
}
}
您正在创建多个测试,每个测试都有一个客户端。
你需要做的是有一个普通的测试,创建多个客户端并发执行。
在我的单元测试;
- 启动服务器作为一个单独的线程(所以我也可以关闭它) 使用ExecutorService作为客户端的线程池
- 有一个循环来创建所有的任务,每个任务创建一个客户端并执行它们。完成后从任务返回。 关闭ExecutorService。
- 检查所有的任务并检查它们是否通过了。如果他们抛出了错误,错误将被抛出到当前(测试)线程。
刚刚发现我在使用threadExecutor。isTerminated和threadExecutor。摊牌,而不是使用threadExecutor。isShutDown和threadExecutor.shutdownNow。我还尝试了threadExecutor.awaitTermination。工作。基本上两个测试是并行运行的。
public static void testLoading() {
threadExecutor = Executors.newCachedThreadPool();
for (int i = 0; i < 50; i++) {
SingleClientTest clientTest = new SingleClientTest();
randomStringList.add(clientTest.getRandomString());
threadExecutor.execute(clientTest);
}
threadExecutor.shutdownNow();
try {
threadExecutor.awaitTermination(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
// while (!threadExecutor.isShutdown()) {
// }
}
public static void testSearching() {
threadExecutor = Executors.newCachedThreadPool();
for (int i = 0; i < 50; i++) {
SingleSearchTest searchTest = new SingleSearchTest(randomStringList);
threadExecutor.execute(searchTest);
}
threadExecutor.shutdownNow();
try {
threadExecutor.awaitTermination(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
// while (!threadExecutor.isShutdown()) {
// }
}