一直使用junit做为服务测试框架,感觉不错。最近有人反映在高并发的情况下,存在服务调不到。无奈再次打开单元测试模拟高并发的情况,却发现junit不支持并发测试
引入groboutils jar包,其实我主要使用MultiThreadedTestRunner类和TestRunnable类。
原有的junit框架不做改变,导入GroboTestingJUnit-1.2.1-core.jar包
代码如下
public class FaultServiceTest extends TestCase { /** * @param args * @throws FaultException * @throws ExpParamNotFoundException * @throws ParseException */ private IFaultService faultService; private static final int NUM_THREAD = 100; // 测试线程总数 public FaultServiceTest() { super(); IInitService initService = (IInitService) CustomBeanFactory .getBean("initService"); initService.initSiteDatabase(); this.faultService = (IFaultService) CustomBeanFactory .getBean("faultService"); } public FaultServiceTest(String name) { super(name); IInitService initService = (IInitService) CustomBeanFactory .getBean("initService"); initService.initSiteDatabase(); this.faultService = (IFaultService) CustomBeanFactory .getBean("faultService"); } // 高并发测试 public void testGetEquipEventAlertListByPage() throws Throwable { EquipmentQueryBean equipmentQueryBean = new EquipmentQueryBean(); // 生成所有测试线程 TestRunnable[] test = new TestRunnable[NUM_THREAD]; long start = System.currentTimeMillis(); for (int i = 0; i < test.length; i++) { test[i] = new FaultServiceThread(faultService, equipmentQueryBean); } // 生成测试线程运行器 MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(test); // 运行测试线程 mttr.runTestRunnables(); long used = System.currentTimeMillis() - start; System.out.printf("%s 调用花费 %s milli-seconds.\n", NUM_THREAD, used); } public static Test suite() { TestSuite test = new TestSuite("HealthService接口类测试"); test.addTest(new FaultServiceTest("testGetEquipEventAlertListByPage")); return test; } /* * 测试线程类定义 */ private static class FaultServiceThread extends TestRunnable { private IFaultService faultService; private EquipmentQueryBean equipmentQueryBean; public FaultServiceThread(IFaultService faultService, EquipmentQueryBean equipmentQueryBean) { super(); this.faultService = faultService; this.equipmentQueryBean = equipmentQueryBean; } @Override public void runTest() throws Throwable { faultService.getEquipEventAlertListByPage(equipmentQueryBean); } } } |
运行代码,并发数开到100个后观察运行时间发现运行运行时间到了12秒了,看来问题出在DAO。需要进行sql代码优化了
导入的测试包有:
import net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner; import net.sourceforge.groboutils.junit.v1.TestRunnable; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; |
最新内容请见作者的GitHub页:http://qaseven.github.io/