├── .gitignore ├── .travis.yml ├── ChangeLog.txt ├── README.md ├── README_zh_CN.md ├── pom.xml └── src ├── main └── java │ └── simperf │ ├── Simperf.java │ ├── annotations │ ├── AfterInvoke.java │ ├── AfterRunTask.java │ ├── BeforeInvoke.java │ ├── BeforeRunTask.java │ ├── Inject.java │ ├── Simperf.java │ └── WarmUp.java │ ├── client │ ├── ClientLatch.java │ └── SimperfClientThread.java │ ├── command │ └── SimperfCommand.java │ ├── config │ ├── Constant.java │ └── SimperfConfig.java │ ├── controllers │ ├── SteppingThreadTrigger.java │ └── TimeSteppingThreadTrigger.java │ ├── junit │ ├── SimperfJUnit4Runner.java │ ├── SimperfJunit4Thread.java │ ├── SimperfMethodRoadie.java │ ├── SimperfMethodValidator.java │ └── SimperfTestCase.java │ ├── remote │ ├── RemoteCmd.java │ ├── RemoteInvoker.java │ ├── RemoteRequest.java │ ├── RemoteSimperf.java │ └── result │ │ └── DefaultRemoteWriter.java │ ├── replayer │ ├── AbstractReplayer.java │ └── SecondReplayer.java │ ├── result │ ├── DataStatistics.java │ ├── DefaultConsolePrinter.java │ ├── DefaultHttpWriter.java │ ├── DefaultLogFileWriter.java │ ├── DefaultSqlFileWriter.java │ ├── JTLRecord.java │ ├── JTLResult.java │ └── StatInfo.java │ ├── thread │ ├── Callback.java │ ├── ControllThread.java │ ├── DefaultCallback.java │ ├── MonitorThread.java │ ├── SimperfThread.java │ ├── SimperfThreadFactory.java │ └── TimeoutAbortThread.java │ └── util │ ├── FileOperateUtils.java │ └── SimperfUtil.java └── test ├── java ├── Test.java └── simperf │ └── sample │ ├── AdjustThreadsTest.java │ ├── RemoteSimperfCommandTest.java │ ├── RemoteSimperfTest.java │ ├── SimperfCallbackTest.java │ ├── SimperfClientLatchTest.java │ ├── SimperfCommandTest.java │ ├── SimperfHttpWriterTest.java │ ├── SimperfTest.java │ ├── SimperfTestCaseTest.java │ ├── SteppingThreadTest.java │ ├── TimeoutAbortTest.java │ ├── thread │ ├── MessageSender.java │ ├── SendMessageClientThread.java │ └── SendMessageThread.java │ ├── ut │ └── SimperfUnitTest.java │ └── util │ └── StdAvg.java └── resources ├── log4j.properties ├── relpay └── second.log └── simperf_server.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.jar 5 | *.war 6 | *.ear 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | -------------------------------------------------------------------------------- /ChangeLog.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/ChangeLog.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### [参考手册](https://github.com/imbugs/simperf/blob/master/README_zh_CN.md)    [Reference manual](https://github.com/imbugs/simperf/blob/master/README.md) 2 | 3 | simperf 4 | ======= 5 | 6 | Simperf is a simple performance test framework for java. It provides a multithread test framework. 7 | 8 | Example: 9 | 10 | 1. Use simperf in java: 11 | ---------------------- 12 |
 13 | Simperf perf = new Simperf(50, 2000, 1000, 
 14 |     new SimperfThreadFactory() {
 15 |         public SimperfThread newThread() {
 16 |             return new SimperfThread();
 17 |         }
 18 |     });
 19 | // setting output file path,simperf-result.log by default.
 20 | perf.getMonitorThread().setLogFile("simperf.log");
 21 | // begin performance testing
 22 | perf.start();
 23 | 
24 | 25 | 2. Use simperf in command line 26 | ------------------------ 27 |
 28 | public class SimperfCommandTest {
 29 | 	public static void main(String[] args) {
 30 | 	    SimperfCommand simCommand = new SimperfCommand(args);
 31 | 	    Simperf perf = simCommand.create();
 32 | 		if (perf == null) {
 33 | 			// fail to parse the args
 34 | 			System.exit(-1);
 35 | 		}
 36 | 	    perf.start(new SimperfThreadFactory() {
 37 | 	        public SimperfThread newThread() {
 38 | 	            return new SimperfThread();
 39 | 	        }
 40 | 	    });
 41 | 	}
 42 | }
 43 | 
44 | execute command: 45 |
 46 | java SimperfCommandTest -t 10 -c 10 -i 1000
 47 | DESCRIPTION :
 48 | usage: SimperfCommand options
 49 |  -c,--count       [*] number of each thread requests count
 50 |  -i,--interval    [ ] interval of print messages, default 1000
 51 |  -j               [ ] generate jtl report
 52 |  -l,--log         [ ] log filename
 53 |  -m,--maxtps      [ ] max tps
 54 |  -o,--timeout     [ ] timeout, in millis
 55 |  -t,--thread      [*] number of thread count
 56 | 
57 | 3. Use simperf in JUnit4 58 | ------------------------ 59 |
 60 | public class SimperfTestCaseTest extends SimperfTestCase {
 61 |     private Random              rand;
 62 |     @Test
 63 |     @Simperf(thread = 2, count = 5, interval = 1000)
 64 |     public void testXxx() {
 65 |         try {
 66 |             Thread.sleep(1000);
 67 |         } catch (Exception e) {
 68 |         }
 69 |         boolean result = rand.nextInt(10) > 1;
 70 |         Assert.assertTrue("random result", result);
 71 |     }
 72 | }
 73 | 
74 | 75 | Download: [simperf-1.0.4.jar](http://tool.imbugs.com/simperf/simperf-1.0.4.jar) 76 | 77 | Reference manual(v1.0.4) 78 | ================ 79 | Settings 80 | -------- 81 | ### Basic Parameters 82 | + The Number Of Concurrent Threads 83 |
 84 |         int thread = 10; // the number of threads
 85 |         int count = 20;  // the number of times to execute the test for each thread, -1 means to run forever
 86 |         Simperf perf = new Simperf(thread, count);
 87 | 		// start simperf
 88 | 
89 | + Interval (default:1000) 90 |
 91 |         Simperf perf = new Simperf(thread, count);
 92 | 		int interval = 1000; // 1000ms
 93 |         perf.setInterval(interval); // Sampling calculation once every 1000 ms
 94 | 		// start simperf
 95 | 
96 | + Timeout (default:-1) 97 |
 98 |         Simperf perf = new Simperf(thread, count);
 99 | 		int timeout = 10000; // 10000ms
100 |         perf.timeout(timeout); // the threads will exit after 10s
101 | 		// start simperf
102 | 
103 | + The Maximum TPS (optional) 104 |
105 |         Simperf perf = new Simperf(thread, count);
106 | 		int maxTps = 10; // the maximum TPS for each thread
107 |         perf.setMaxTps(maxTps);
108 | 		// start simperf
109 | 
110 | 111 | ### The Options Of Command Line 112 | [Use simperf in command line](#2-use-simperf-in-command-line) has given the supported options by Simperf. You could add your own options if you need. 113 |
114 | 		SimperfCommand simCommand = new SimperfCommand(args);
115 |         simCommand.getOptions().addOption("a", "argument", true, "a custom argument");
116 |         Simperf perf = simCommand.create();
117 | 		if (simCommand.getCmd().hasOption("a")) {
118 |             System.out.println(simCommand.getCmd().getOptionValue("a"));
119 |         }
120 | 
121 | 122 | The Output Result 123 | -------- 124 | ### support types 125 | + log results by log4j 126 | + write the results into a file (It will flush the cache after complete) 127 | + jtl file, which analyzed by jmeter 128 | + SQL 129 | + custom types 130 | Simperf registers log4j and file writer by default, and it will take JSON as the default format. 131 | 132 | ### Change The Output Format 133 |
134 |         Simperf perf = new Simperf(10, 10);
135 |         perf.getMonitorThread().clearCallback(); //clear all callback
136 |         perf.getMonitorThread().registerCallback(new DefaultConsolePrinter()); //register DefaultConsolePrinter, which uses log4j
137 |         perf.getMonitorThread().registerCallback(
138 |             new DefaultLogFileWriter(Constant.DEFAULT_RESULT_LOG)); //register DefaultLogFileWriter to write file ,default file name:simperf-result.log
139 |         perf.getMonitorThread().registerCallback(new DefaultSqlFileWriter("xxx.sql"));//register DefaultSqlFileWriter, write Sql to file
140 | 		// start simperf
141 | 
142 | There are some different to use JTL. 143 |
144 | 		Simperf perf = new Simperf(10, 10);
145 |         // print JTL record
146 |         JTLResult jtl = new JTLResult(perf.getMonitorThread()); //default file: Constant.DEFAULT_JTL_FILE
147 |         SimperfConfig.setConfig(SimperfConfig.JTL_RESULT, jtl);
148 | 		// start simperf
149 | 
150 | 151 | ### Change The Output Location/File 152 | + Set the filename for writer 153 |
154 | 		Simperf perf = new Simperf(10, 10);
155 |         perf.getMonitorThread().setLogFile("simperf.log"); //FileWriter will write data into simperf.log
156 | 
157 | + Register callbacks by yourself 158 |
159 |         Simperf perf = new Simperf(10, 10);
160 |         perf.getMonitorThread().clearCallback(); //clear all callbacks
161 |         perf.getMonitorThread().registerCallback(new DefaultLogFileWriter("simperf.log"));
162 | 
163 | 164 | ### Custom Output Callback 165 | Create a class extends DefaultCallback,and then call method perf.getMonitorThread().registerCallback() to register callback objects. 166 |
167 |     public void onStart(MonitorThread monitorThread); // call on start test
168 |     public void onMonitor(MonitorThread monitorThread, StatInfo statInfo); // call on calculate the output
169 |     public void onExit(MonitorThread monitorThread); //call on simperf exit
170 | 
171 | 172 | ### Setting Output Format 173 |
174 | 	Constant.DEFAULT_NA = "NaA"; //output when NA,0 as a divisor for example
175 |     Constant.DEFAULT_DIVIDE_FORMAT = "%.3f"; //round number to three decimal places
176 | 	// output format which use to log or write results,Json by default,the format contains %s,%s,%d,%d,%d,%s,%d,%d,%d
177 |     Constant.DEFAULT_MSG_FORMAT = ">>>\ntime:%s\navgTps:%s\ncount:%d\nduration:%d\nfail:%d\ntTps:%s\ntCount:%d\ntDuration:%d\ntFail:%d\n";
178 |     Constant.DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss"); // default data format
179 | 
180 | 181 | Dynamic Adjustment 182 | -------- 183 | + Change the number of concurrent threads when testing 184 |
185 |     public static void main(String[] args) {
186 |         Simperf perf = new Simperf(10, 100);
187 |         perf.start(new SimperfThreadFactory() {
188 |             public SimperfThread newThread() {
189 |                 return new SendMessageThread();
190 |             }
191 |         });
192 |         thread(perf, 7);
193 |         thread(perf, 10);
194 |         thread(perf, 15);
195 |         thread(perf, 20);
196 |         thread(perf, 15);
197 |         thread(perf, 25);
198 |         thread(perf, 10);
199 |         thread(perf, 5);
200 |     }
201 | 	// Change the number of concurrent threads every 5s
202 |     public static void thread(Simperf perf, int size) {
203 |         try {
204 |             Thread.sleep(5000);
205 |         } catch (InterruptedException e) {
206 |         }
207 |         perf.thread(size); // dynamic adjustment
208 |     }
209 | 
210 | + Change the number of times to execute for each thread when testing 211 |
212 | 	Simperf perf = new Simperf(10, 100);
213 | 	// start simperf
214 | 	perf.count(200); // dynamic adjustment
215 | 
216 | + Change the interval of print results when testing 217 |
218 | 	Simperf perf = new Simperf(10, 100);
219 | 	// start simperf
220 | 	perf.interval(2000); // dynamic adjustment
221 | 
222 | 223 | + Stepping change the number of concurrent thread 224 |
225 | 		Simperf perf = new Simperf(10, 20);
226 |         TimeSteppingThreadTrigger trigger = new TimeSteppingThreadTrigger(3000, 3); //add three new threads every 3s
227 |         trigger.setMaxThreads(18); //the maximum number of threads is 18
228 |         trigger.startWork(perf); // start work
229 | 		// start simpef
230 | 
231 | 232 | SimperfThread 233 | ------------- 234 | SimperfThread is the most important class in Simperf,which implements the specific tasks. You must extend and implement SimperfThread in Simperf for your transactions. 235 |
236 | public class DemoSimperfThread extends SimperfThread {
237 |     // Required
238 |     public boolean runTask() {
239 |         // implement a transaction operate
240 |         doSleep();
241 |         // return the result, true if success otherwise false
242 |         return true;
243 |     }
244 | 
245 |     /**
246 |      * Sample task, sleep 20ms
247 |      */
248 |     public void doSleep() {
249 |         try {
250 |             Thread.sleep(20);
251 |         } catch (Exception e) {
252 |         }
253 |     }
254 | 
255 |     // Optional
256 |     public void warmUp() {
257 |     }
258 | 
259 | 	// Optional
260 |     public void beforeRunTask() {
261 |     }
262 | 
263 | 	// Optional
264 |     public void afterRunTask() {
265 |     }
266 | 
267 | 	// Optional
268 |     protected Object beforeInvoke() {
269 |         return System.currentTimeMillis();
270 |     }
271 | 
272 | 	// Optional
273 |     protected void afterInvoke(boolean result, Object beforeInvokeResult) {
274 |         long begin = (Long) beforeInvokeResult;
275 |         long end = (Long) System.currentTimeMillis();
276 |         System.out.println("result:" + result + ",duration:" + (end - begin));
277 |     }
278 | }
279 | 
280 | Support For Junit4 281 | ------------ 282 | All of the futures are available in Junit 4 283 |
284 | public class SimperfTestCaseTest extends SimperfTestCase {
285 |     private static final Logger logger = LoggerFactory.getLogger(SimperfTestCaseTest.class);
286 |     private Random              rand;
287 |     @Before
288 |     public void before() {
289 |         TimeSteppingThreadTrigger t = new TimeSteppingThreadTrigger(2000, 2); // set a stepping thread concurent trigger
290 |         t.startWork(simperf);
291 |         rand = new Random();
292 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.before()");
293 |     }
294 | 
295 |     @After
296 |     public void after() {
297 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.after()");
298 |     }
299 | 
300 |     @BeforeInvoke
301 |     public void beforeInvoke() {
302 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.beforeInvoke()");
303 |     }
304 | 
305 |     @AfterInvoke
306 |     public void afterInvoke() {
307 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.afterInvoke()");
308 |     }
309 | 
310 |     @BeforeRunTask
311 |     public void beforeRunTask() {
312 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.beforeRunTask()");
313 |     }
314 | 
315 |     @AfterRunTask
316 |     public void afterRunTask() {
317 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.afterRunTask()");
318 |     }
319 | 
320 |     @WarmUp
321 |     public void warmUp() {
322 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.warmUp()");
323 |     }
324 | 
325 |     @Test
326 |     @Simperf(thread = 2, count = 5, interval = 1000)
327 |     public void testXxx() {
328 |         try {
329 |             Thread.sleep(1000);
330 |         } catch (Exception e) {
331 |         }
332 |         boolean result = rand.nextInt(10) > 1; // 10% failed
333 |         Assert.assertTrue("xxxx", result);
334 |     }
335 | }
336 | 
337 | -------------------------------------------------------------------------------- /README_zh_CN.md: -------------------------------------------------------------------------------- 1 | ### [参考手册](https://github.com/imbugs/simperf/blob/master/README_zh_CN.md)    [Reference manual](https://github.com/imbugs/simperf/blob/master/README.md) 2 | 3 | simperf 4 | ======= 5 | 6 | Simperf 是一个简单的性能测试工具,它提供了一个多线程测试框架 7 | 8 | Example: 9 | 10 | 1. 在代码里使用Simperf 11 | ---------------------- 12 |
 13 | Simperf perf = new Simperf(50, 2000, 1000, 
 14 |     new SimperfThreadFactory() {
 15 |         public SimperfThread newThread() {
 16 |             return new SimperfThread();
 17 |         }
 18 |     });
 19 | // 设置结果输出文件,默认 simperf-result.log
 20 | perf.getMonitorThread().setLogFile("simperf.log");
 21 | // 开始性能测试
 22 | perf.start();
 23 | 
24 | 25 | 2. 在命令行里使用Simperf 26 | ------------------------ 27 |
 28 | public class SimperfCommandTest {
 29 | 	public static void main(String[] args) {
 30 | 	    SimperfCommand simCommand = new SimperfCommand(args);
 31 | 	    Simperf perf = simCommand.create();
 32 | 		if (perf == null) {
 33 | 			// 参数解析失败时会返回null
 34 | 			System.exit(-1);
 35 | 		}
 36 | 	    perf.start(new SimperfThreadFactory() {
 37 | 	        public SimperfThread newThread() {
 38 | 	            return new SimperfThread();
 39 | 	        }
 40 | 	    });
 41 | 	}
 42 | }
 43 | 
44 | 执行命令: 45 |
 46 | java SimperfCommandTest -t 10 -c 10 -i 1000
 47 | 参数说明:
 48 | usage: SimperfCommand options
 49 |  -c,--count       [*] number of each thread requests count
 50 |  -i,--interval    [ ] interval of print messages, default 1000
 51 |  -j               [ ] generate jtl report
 52 |  -l,--log         [ ] log filename
 53 |  -m,--maxtps      [ ] max tps
 54 |  -o,--timeout     [ ] timeout, in millis
 55 |  -t,--thread      [*] number of thread count
 56 | 
57 | 3. 在Junit4里使用Simperf 58 | ------------------------ 59 |
 60 | public class SimperfTestCaseTest extends SimperfTestCase {
 61 |     private Random              rand;
 62 |     @Test
 63 |     @Simperf(thread = 2, count = 5, interval = 1000)
 64 |     public void testXxx() {
 65 |         try {
 66 |             Thread.sleep(1000);
 67 |         } catch (Exception e) {
 68 |         }
 69 |         boolean result = rand.nextInt(10) > 1;
 70 |         Assert.assertTrue("随机生成结果", result);
 71 |     }
 72 | }
 73 | 
74 | 75 | 下载: [simperf-1.0.4.jar](http://tool.imbugs.com/simperf/simperf-1.0.4.jar) 76 | 77 | 参考手册(v1.0.4) 78 | ================ 79 | 参数的配置 80 | -------- 81 | ### 基本参数 82 | + 并发线程数和调用次数 83 |
 84 |         int thread = 10; //并发线程数
 85 |         int count = 20;  //每个线程的循环次数
 86 |         Simperf perf = new Simperf(thread, count);
 87 | 		// 启动simperf
 88 | 
89 | + 采样时间间隔(默认1000) 90 |
 91 |         Simperf perf = new Simperf(thread, count);
 92 | 		int interval = 1000; // 1000ms
 93 |         perf.setInterval(interval); //每隔1000ms进行一次采样计算
 94 | 		// 启动simperf
 95 | 
96 | + 超时设置(默认-1) 97 |
 98 |         Simperf perf = new Simperf(thread, count);
 99 | 		int timeout = 10000; // 10000ms
100 |         perf.timeout(timeout); // 在10s后线程会中止运行
101 | 		// start simperf
102 | 
103 | + 限制最大TPS(可选) 104 |
105 |         Simperf perf = new Simperf(thread, count);
106 | 		int maxTps = 10; //单个线程的最大TPS
107 |         perf.setMaxTps(maxTps);
108 | 		// 启动simperf
109 | 
110 | 111 | ### 命令行参数 112 | 在[命令行里使用Simperf](#2-在命令行里使用simperf)中已经给出了框架支持的参数,你可以根据自已的需要来添加支持的参数 113 |
114 | 		SimperfCommand simCommand = new SimperfCommand(args);
115 |         simCommand.getOptions().addOption("a", "argument", true, "一个自定义参数");
116 |         Simperf perf = simCommand.create();
117 | 		if (simCommand.getCmd().hasOption("a")) {
118 |             System.out.println(simCommand.getCmd().getOptionValue("a"));
119 |         }
120 | 
121 | 122 | 结果输出 123 | -------- 124 | ### 支持输出类型 125 | + 结果log日志输出 126 | + 结果文件输出(文件输出可能有缓冲,运行完毕后才全部flush到文件中) 127 | + jtl文件输出(可提供给jmeter分析) 128 | + SQL文件输出 129 | + 自定义输出 130 | 框架默认加载了log日志与文件输出两个输出模块,输出格式为Json格式 131 | 132 | ### 调整输出类型 133 |
134 |         Simperf perf = new Simperf(10, 10);
135 |         perf.getMonitorThread().clearCallback(); //清除所有callback
136 |         perf.getMonitorThread().registerCallback(new DefaultConsolePrinter()); //添加默认控制台输出(log日志输出模块)
137 |         perf.getMonitorThread().registerCallback(
138 |             new DefaultLogFileWriter(Constant.DEFAULT_RESULT_LOG)); //添加结果文件输出模块,默认文件名为:simperf-result.log
139 |         perf.getMonitorThread().registerCallback(new DefaultSqlFileWriter("xxx.sql"));//添加SQL文件输出
140 | 		// 启动simperf
141 | 
142 | jtl文件的配置与其它几种类型配置方式有些不同 143 |
144 | 		Simperf perf = new Simperf(10, 10);
145 |         // 打印JTL日志,会有一些性能损耗
146 |         JTLResult jtl = new JTLResult(perf.getMonitorThread()); //默认输出到Constant.DEFAULT_JTL_FILE
147 |         SimperfConfig.setConfig(SimperfConfig.JTL_RESULT, jtl);
148 | 		// 启动simperf
149 | 
150 | 151 | ### 调整输出位置 152 | + 文件输出位置 153 |
154 | 		Simperf perf = new Simperf(10, 10);
155 |         perf.getMonitorThread().setLogFile("simperf.log"); //会输出到指定的simperf.log文件中
156 | 
157 | + 自已添加指定的输出模块 158 |
159 |         Simperf perf = new Simperf(10, 10);
160 |         perf.getMonitorThread().clearCallback(); //清除所有callback
161 |         perf.getMonitorThread().registerCallback(new DefaultLogFileWriter("simperf.log"));
162 | 
163 | 164 | ### 自定义输出 165 | 定义一个输出模块,继承DefaultCallback基类,然后使用perf.getMonitorThread().registerCallback来加载输出模块 166 |
167 |     public void onStart(MonitorThread monitorThread); //simperf启动时会调用
168 |     public void onMonitor(MonitorThread monitorThread, StatInfo statInfo); //每次采样计算数据时会调用
169 |     public void onExit(MonitorThread monitorThread); //simperf退出时会调用
170 | 
171 | 172 | ### 设置输出格式 173 |
174 | 	Constant.DEFAULT_NA = "NaA"; //当出现NA情况时的输出,如0做为除数
175 |     Constant.DEFAULT_DIVIDE_FORMAT = "%.3f"; //精确到3位小数
176 | 	// 结果输出格式,默认为Json,需要按顺序补全%s,%s,%d,%d,%d,%s,%d,%d,%d,使用于日志输出与文件输出模块
177 |     Constant.DEFAULT_MSG_FORMAT = ">>>\ntime:%s\navgTps:%s\ncount:%d\nduration:%d\nfail:%d\ntTps:%s\ntCount:%d\ntDuration:%d\ntFail:%d\n";
178 |     Constant.DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss"); //日期输出格式
179 | 
180 | 181 | 动态调整 182 | -------- 183 | + 运行时调整并发量 184 |
185 |     public static void main(String[] args) {
186 |         Simperf perf = new Simperf(10, 100);
187 |         perf.start(new SimperfThreadFactory() {
188 |             public SimperfThread newThread() {
189 |                 return new SendMessageThread();
190 |             }
191 |         });
192 |         thread(perf, 7);
193 |         thread(perf, 10);
194 |         thread(perf, 15);
195 |         thread(perf, 20);
196 |         thread(perf, 15);
197 |         thread(perf, 25);
198 |         thread(perf, 10);
199 |         thread(perf, 5);
200 |     }
201 | 	// 每隔5s调整一次并发线程数
202 |     public static void thread(Simperf perf, int size) {
203 |         try {
204 |             Thread.sleep(5000);
205 |         } catch (InterruptedException e) {
206 |         }
207 |         perf.thread(size); //动态调整线程数
208 |     }
209 | 
210 | + 动态调整调用次数 211 |
212 | 	Simperf perf = new Simperf(10, 100);
213 | 	// 启动simperf
214 | 	perf.count(200); // 运行过程中可以动态调整
215 | 
216 | + 动态调用监控频率(采样间隔) 217 |
218 | 	Simperf perf = new Simperf(10, 100);
219 | 	// 启动simperf
220 | 	perf.interval(2000); // 动态调整为2s采样一次
221 | 
222 | 223 | + 步进调整线程 224 |
225 | 		Simperf perf = new Simperf(10, 20);
226 |         TimeSteppingThreadTrigger trigger = new TimeSteppingThreadTrigger(3000, 3); //每3s增加三个新线程
227 |         trigger.setMaxThreads(18); //最大线程数为18
228 |         trigger.startWork(perf); //开始调整
229 | 		// 启动simpef
230 | 
231 | 232 | SimperfThread 233 | ------------- 234 | 整个框架是围绕SimperfThread来进行的,SimperfThread是进行具体任务的线程,使用Simperf必须要一个继承了SimperfThread的类,然后实现一个事务操作 235 |
236 | public class DemoSimperfThread extends SimperfThread {
237 |     // 必选
238 |     public boolean runTask() {
239 |         // 实现一个事务操作
240 |         doSleep();
241 |         // 返回一个结果,true表示该事务成功,false表示该事务失败
242 |         return true;
243 |     }
244 | 
245 |     /**
246 |      * 睡眠20ms的事务操作
247 |      */
248 |     public void doSleep() {
249 |         try {
250 |             Thread.sleep(20);
251 |         } catch (Exception e) {
252 |         }
253 |     }
254 | 
255 |     // 可选,预热(阀门打开之前执行,会同步等待其它线程全部执行完毕)
256 |     public void warmUp() {
257 |     }
258 | 
259 |     // 可选,执行runTask()之前只执行一次,在阀门打开之后执行,线程不同步等待
260 |     public void beforeRunTask() {
261 |     }
262 | 
263 |     // 可选,执行runTask()之后调用,只执行一次
264 |     public void afterRunTask() {
265 |     }
266 | 
267 |     // 不建议使用,每次执行runTask()之前调用,SimperfThread中用于收集JTL中的耗时信息
268 |     protected Object beforeInvoke() {
269 |         return System.currentTimeMillis();
270 |     }
271 | 
272 |     // 不建议使用,每次执行runTask()之后调用,SimperfThread中用于收集JTL中的耗时信息
273 |     protected void afterInvoke(boolean result, Object beforeInvokeResult) {
274 |         long begin = (Long) beforeInvokeResult;
275 |         long end = (Long) System.currentTimeMillis();
276 |         System.out.println("本次调用结果:" + result + ",本次调用耗时:" + (end - begin));
277 |     }
278 | }
279 | 
280 | Junit4的支持 281 | ------------ 282 | 以上特性全部都可以结合Junit4实现 283 |
284 | public class SimperfTestCaseTest extends SimperfTestCase {
285 |     private static final Logger logger = LoggerFactory.getLogger(SimperfTestCaseTest.class);
286 |     private Random              rand;
287 |     @Before
288 |     public void before() {
289 |         TimeSteppingThreadTrigger t = new TimeSteppingThreadTrigger(2000, 2); //设置步进并发量
290 |         t.startWork(simperf);
291 |         rand = new Random();
292 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.before()");
293 |     }
294 | 
295 |     @After
296 |     public void after() {
297 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.after()");
298 |     }
299 | 
300 |     @BeforeInvoke
301 |     public void beforeInvoke() {
302 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.beforeInvoke()");
303 |     }
304 | 
305 |     @AfterInvoke
306 |     public void afterInvoke() {
307 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.afterInvoke()");
308 |     }
309 | 
310 |     @BeforeRunTask
311 |     public void beforeRunTask() {
312 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.beforeRunTask()");
313 |     }
314 | 
315 |     @AfterRunTask
316 |     public void afterRunTask() {
317 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.afterRunTask()");
318 |     }
319 | 
320 |     @WarmUp
321 |     public void warmUp() {
322 |         logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.warmUp()");
323 |     }
324 | 
325 |     @Test
326 |     @Simperf(thread = 2, count = 5, interval = 1000)
327 |     public void testXxx() {
328 |         try {
329 |             Thread.sleep(1000);
330 |         } catch (Exception e) {
331 |         }
332 |         boolean result = rand.nextInt(10) > 1; //失败率为10%
333 |         Assert.assertTrue("xxxx", result);
334 |     }
335 | }
336 | 
337 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | simperf 5 | simperf 6 | 1.0.7 7 | jar 8 | simple-perf 9 | http://imbugs.com 10 | 11 | 12 | commons-cli 13 | commons-cli 14 | 1.2 15 | 16 | 17 | com.google.code.gson 18 | gson 19 | 2.2.2 20 | 21 | 22 | org.slf4j 23 | slf4j-api 24 | 1.5.2 25 | 26 | 27 | org.slf4j 28 | slf4j-log4j12 29 | 1.5.2 30 | 31 | 32 | log4j 33 | log4j 34 | 1.2.14 35 | 36 | 37 | junit 38 | junit 39 | 4.4 40 | 41 | 42 | commons-lang 43 | commons-lang 44 | 2.6 45 | 46 | 47 | 48 | 49 | 50 | maven-compiler-plugin 51 | 2.0.2 52 | 53 | 1.5 54 | 1.5 55 | GBK 56 | 57 | 58 | 59 | maven-source-plugin 60 | 2.2.1 61 | 62 | 63 | attach-sources 64 | 65 | jar 66 | 67 | 68 | 69 | 70 | 71 | maven-javadoc-plugin 72 | 2.9 73 | 74 | GBK 75 | public 76 | 77 | 78 | 79 | maven-dependency-plugin 80 | 81 | 82 | package 83 | 84 | copy-dependencies 85 | 86 | 87 | ${project.build.directory}/lib 88 | 89 | 90 | 91 | 92 | 93 | org.apache.maven.plugins 94 | maven-surefire-plugin 95 | 2.8 96 | 97 | 98 | **/*UnitTest.java 99 | 100 | true 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /src/main/java/simperf/Simperf.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/Simperf.java -------------------------------------------------------------------------------- /src/main/java/simperf/annotations/AfterInvoke.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/annotations/AfterInvoke.java -------------------------------------------------------------------------------- /src/main/java/simperf/annotations/AfterRunTask.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/annotations/AfterRunTask.java -------------------------------------------------------------------------------- /src/main/java/simperf/annotations/BeforeInvoke.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/annotations/BeforeInvoke.java -------------------------------------------------------------------------------- /src/main/java/simperf/annotations/BeforeRunTask.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/annotations/BeforeRunTask.java -------------------------------------------------------------------------------- /src/main/java/simperf/annotations/Inject.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/annotations/Inject.java -------------------------------------------------------------------------------- /src/main/java/simperf/annotations/Simperf.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/annotations/Simperf.java -------------------------------------------------------------------------------- /src/main/java/simperf/annotations/WarmUp.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/annotations/WarmUp.java -------------------------------------------------------------------------------- /src/main/java/simperf/client/ClientLatch.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/client/ClientLatch.java -------------------------------------------------------------------------------- /src/main/java/simperf/client/SimperfClientThread.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/client/SimperfClientThread.java -------------------------------------------------------------------------------- /src/main/java/simperf/command/SimperfCommand.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/command/SimperfCommand.java -------------------------------------------------------------------------------- /src/main/java/simperf/config/Constant.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/config/Constant.java -------------------------------------------------------------------------------- /src/main/java/simperf/config/SimperfConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/config/SimperfConfig.java -------------------------------------------------------------------------------- /src/main/java/simperf/controllers/SteppingThreadTrigger.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/controllers/SteppingThreadTrigger.java -------------------------------------------------------------------------------- /src/main/java/simperf/controllers/TimeSteppingThreadTrigger.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/controllers/TimeSteppingThreadTrigger.java -------------------------------------------------------------------------------- /src/main/java/simperf/junit/SimperfJUnit4Runner.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/junit/SimperfJUnit4Runner.java -------------------------------------------------------------------------------- /src/main/java/simperf/junit/SimperfJunit4Thread.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/junit/SimperfJunit4Thread.java -------------------------------------------------------------------------------- /src/main/java/simperf/junit/SimperfMethodRoadie.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/junit/SimperfMethodRoadie.java -------------------------------------------------------------------------------- /src/main/java/simperf/junit/SimperfMethodValidator.java: -------------------------------------------------------------------------------- 1 | package simperf.junit; 2 | 3 | import java.lang.annotation.Annotation; 4 | import java.lang.reflect.Method; 5 | import java.lang.reflect.Modifier; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | import org.junit.internal.runners.InitializationError; 10 | import org.junit.internal.runners.TestClass; 11 | 12 | import simperf.annotations.AfterInvoke; 13 | import simperf.annotations.AfterRunTask; 14 | import simperf.annotations.BeforeInvoke; 15 | import simperf.annotations.BeforeRunTask; 16 | import simperf.annotations.WarmUp; 17 | 18 | public class SimperfMethodValidator { 19 | 20 | private final List fErrors = new ArrayList(); 21 | 22 | private TestClass fTestClass; 23 | 24 | public SimperfMethodValidator(TestClass testClass) { 25 | fTestClass = testClass; 26 | } 27 | 28 | public void validateInstanceMethods() { 29 | validateTestMethods(BeforeRunTask.class, false); 30 | validateTestMethods(WarmUp.class, false); 31 | validateTestMethods(BeforeInvoke.class, false); 32 | validateTestMethods(AfterInvoke.class, false); 33 | validateTestMethods(AfterRunTask.class, false); 34 | } 35 | 36 | public List validateMethodsForDefaultRunner() { 37 | validateInstanceMethods(); 38 | return fErrors; 39 | } 40 | 41 | public void assertValid() throws InitializationError { 42 | if (!fErrors.isEmpty()) 43 | throw new InitializationError(fErrors); 44 | } 45 | 46 | public void validateTestMethods(Class annotation, boolean isStatic) { 47 | List methods = fTestClass.getAnnotatedMethods(annotation); 48 | 49 | for (Method each : methods) { 50 | if (Modifier.isStatic(each.getModifiers()) != isStatic) { 51 | String state = isStatic ? "should" : "should not"; 52 | fErrors 53 | .add(new Exception("Method " + each.getName() + "() " + state + " be static")); 54 | } 55 | if (!Modifier.isPublic(each.getDeclaringClass().getModifiers())) 56 | fErrors.add(new Exception("Class " + each.getDeclaringClass().getName() 57 | + " should be public")); 58 | if (!Modifier.isPublic(each.getModifiers())) 59 | fErrors.add(new Exception("Method " + each.getName() + " should be public")); 60 | if (each.getReturnType() != Void.TYPE) 61 | fErrors.add(new Exception("Method " + each.getName() + " should be void")); 62 | if (each.getParameterTypes().length != 0) 63 | fErrors 64 | .add(new Exception("Method " + each.getName() + " should have no parameters")); 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/simperf/junit/SimperfTestCase.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/junit/SimperfTestCase.java -------------------------------------------------------------------------------- /src/main/java/simperf/remote/RemoteCmd.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/remote/RemoteCmd.java -------------------------------------------------------------------------------- /src/main/java/simperf/remote/RemoteInvoker.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/remote/RemoteInvoker.java -------------------------------------------------------------------------------- /src/main/java/simperf/remote/RemoteRequest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/remote/RemoteRequest.java -------------------------------------------------------------------------------- /src/main/java/simperf/remote/RemoteSimperf.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/remote/RemoteSimperf.java -------------------------------------------------------------------------------- /src/main/java/simperf/remote/result/DefaultRemoteWriter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/remote/result/DefaultRemoteWriter.java -------------------------------------------------------------------------------- /src/main/java/simperf/replayer/AbstractReplayer.java: -------------------------------------------------------------------------------- 1 | package simperf.replayer; 2 | 3 | import java.util.concurrent.Semaphore; 4 | 5 | public abstract class AbstractReplayer extends Semaphore { 6 | private static final long serialVersionUID = -3198358114016132463L; 7 | 8 | public AbstractReplayer() { 9 | this(0); 10 | } 11 | 12 | public AbstractReplayer(int permits) { 13 | super(permits); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/simperf/replayer/SecondReplayer.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/replayer/SecondReplayer.java -------------------------------------------------------------------------------- /src/main/java/simperf/result/DataStatistics.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/result/DataStatistics.java -------------------------------------------------------------------------------- /src/main/java/simperf/result/DefaultConsolePrinter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/result/DefaultConsolePrinter.java -------------------------------------------------------------------------------- /src/main/java/simperf/result/DefaultHttpWriter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/result/DefaultHttpWriter.java -------------------------------------------------------------------------------- /src/main/java/simperf/result/DefaultLogFileWriter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/result/DefaultLogFileWriter.java -------------------------------------------------------------------------------- /src/main/java/simperf/result/DefaultSqlFileWriter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/result/DefaultSqlFileWriter.java -------------------------------------------------------------------------------- /src/main/java/simperf/result/JTLRecord.java: -------------------------------------------------------------------------------- 1 | package simperf.result; 2 | 3 | public class JTLRecord { 4 | public long elapsedTime; 5 | public long tsend; 6 | public boolean result; 7 | public long tid; 8 | 9 | public JTLRecord(long elapsedTime, long tsend, boolean result) { 10 | this.elapsedTime = elapsedTime; 11 | this.tsend = tsend; 12 | this.result = result; 13 | this.tid = Thread.currentThread().getId(); 14 | } 15 | 16 | public JTLRecord(long elapsedTime, long tsend, boolean result, long tid) { 17 | this.elapsedTime = elapsedTime; 18 | this.tsend = tsend; 19 | this.result = result; 20 | this.tid = tid; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/simperf/result/JTLResult.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/result/JTLResult.java -------------------------------------------------------------------------------- /src/main/java/simperf/result/StatInfo.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/result/StatInfo.java -------------------------------------------------------------------------------- /src/main/java/simperf/thread/Callback.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/thread/Callback.java -------------------------------------------------------------------------------- /src/main/java/simperf/thread/ControllThread.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/thread/ControllThread.java -------------------------------------------------------------------------------- /src/main/java/simperf/thread/DefaultCallback.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/thread/DefaultCallback.java -------------------------------------------------------------------------------- /src/main/java/simperf/thread/MonitorThread.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/thread/MonitorThread.java -------------------------------------------------------------------------------- /src/main/java/simperf/thread/SimperfThread.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/thread/SimperfThread.java -------------------------------------------------------------------------------- /src/main/java/simperf/thread/SimperfThreadFactory.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/thread/SimperfThreadFactory.java -------------------------------------------------------------------------------- /src/main/java/simperf/thread/TimeoutAbortThread.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/thread/TimeoutAbortThread.java -------------------------------------------------------------------------------- /src/main/java/simperf/util/FileOperateUtils.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/util/FileOperateUtils.java -------------------------------------------------------------------------------- /src/main/java/simperf/util/SimperfUtil.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/main/java/simperf/util/SimperfUtil.java -------------------------------------------------------------------------------- /src/test/java/Test.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/test/java/Test.java -------------------------------------------------------------------------------- /src/test/java/simperf/sample/AdjustThreadsTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import simperf.Simperf; 7 | import simperf.sample.thread.MessageSender; 8 | import simperf.sample.thread.SendMessageThread; 9 | import simperf.thread.SimperfThread; 10 | import simperf.thread.SimperfThreadFactory; 11 | 12 | public class AdjustThreadsTest { 13 | private static final Logger logger = LoggerFactory.getLogger(AdjustThreadsTest.class); 14 | 15 | static MessageSender sender = new MessageSender(); 16 | 17 | /** 18 | * @param args 19 | */ 20 | public static void main(String[] args) { 21 | 22 | Simperf perf = new Simperf(10, 100); 23 | perf.getMonitorThread().setLogFile("xxx.log"); 24 | perf.start(new SimperfThreadFactory() { 25 | public SimperfThread newThread() { 26 | SendMessageThread t = new SendMessageThread(); 27 | t.setSender(sender); 28 | return t; 29 | } 30 | }); 31 | thread(perf, 7); 32 | thread(perf, 10); 33 | thread(perf, 15); 34 | thread(perf, 20); 35 | thread(perf, 15); 36 | thread(perf, 25); 37 | thread(perf, 10); 38 | thread(perf, 5); 39 | } 40 | 41 | public static void thread(Simperf perf, int size) { 42 | try { 43 | Thread.sleep(5000); 44 | } catch (InterruptedException e) { 45 | logger.error("", e); 46 | } 47 | perf.thread(size); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/RemoteSimperfCommandTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import simperf.Simperf; 4 | import simperf.command.SimperfCommand; 5 | import simperf.config.Constant; 6 | import simperf.remote.RemoteSimperf; 7 | import simperf.sample.thread.MessageSender; 8 | import simperf.sample.thread.SendMessageThread; 9 | import simperf.thread.SimperfThread; 10 | import simperf.thread.SimperfThreadFactory; 11 | 12 | public class RemoteSimperfCommandTest { 13 | static MessageSender sender = new MessageSender(); 14 | 15 | public static void main(String[] args) { 16 | String[] xx = new String[] { "-c", "300", "-t", "10", "-i", "1000", "-o", "20000", "-h", 17 | "localhost", "-s", "888" }; 18 | Constant.DEFAULT_NA = null; 19 | SimperfCommand simCommand = new SimperfCommand(xx); 20 | simCommand.getOptions().addOption("h", "host", true, "[*] remote simperf server"); 21 | simCommand.getOptions().addOption("s", "session", true, "[*] simperf client session"); 22 | Simperf simperf = simCommand.create(); 23 | if (simperf == null) { 24 | System.exit(-1); 25 | } 26 | simperf.setThreadFactory(new SimperfThreadFactory() { 27 | public SimperfThread newThread() { 28 | SendMessageThread t = new SendMessageThread(); 29 | t.setSender(sender); 30 | return t; 31 | } 32 | }); 33 | 34 | String server = simCommand.getCmd().getOptionValue("h"); 35 | String session = simCommand.getCmd().getOptionValue("s"); 36 | 37 | RemoteSimperf remoteSimperf = new RemoteSimperf(simperf, server); 38 | remoteSimperf.setSession(session); 39 | remoteSimperf.start(); 40 | 41 | simperf.start(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/RemoteSimperfTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import simperf.Simperf; 4 | import simperf.remote.RemoteSimperf; 5 | import simperf.sample.thread.MessageSender; 6 | import simperf.sample.thread.SendMessageThread; 7 | import simperf.thread.SimperfThread; 8 | import simperf.thread.SimperfThreadFactory; 9 | 10 | public class RemoteSimperfTest { 11 | static MessageSender sender = new MessageSender(); 12 | static String server = "localhost"; 13 | 14 | public static void main(String[] args) { 15 | Simperf simperf = new Simperf(10, 1000); 16 | simperf.setThreadFactory(new SimperfThreadFactory() { 17 | public SimperfThread newThread() { 18 | SendMessageThread t = new SendMessageThread(); 19 | t.setSender(sender); 20 | return t; 21 | } 22 | }); 23 | //simperf.start(); 24 | RemoteSimperf remoteSimperf = new RemoteSimperf(simperf, server); 25 | remoteSimperf.setSession("hello kitty"); 26 | remoteSimperf.start(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/SimperfCallbackTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/test/java/simperf/sample/SimperfCallbackTest.java -------------------------------------------------------------------------------- /src/test/java/simperf/sample/SimperfClientLatchTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import simperf.Simperf; 4 | import simperf.client.ClientLatch; 5 | import simperf.sample.thread.MessageSender; 6 | import simperf.sample.thread.SendMessageClientThread; 7 | import simperf.thread.SimperfThread; 8 | import simperf.thread.SimperfThreadFactory; 9 | 10 | public class SimperfClientLatchTest { 11 | static MessageSender sender = new MessageSender(); 12 | static ClientLatch clientLatch = new ClientLatch("localhost"); 13 | 14 | /** 15 | * @param args 16 | */ 17 | public static void main(String[] args) { 18 | 19 | Simperf perf = new Simperf(3, 1000); 20 | sender.sleepTime = 100; 21 | 22 | perf.start(new SimperfThreadFactory() { 23 | public SimperfThread newThread() { 24 | SendMessageClientThread t = new SendMessageClientThread(clientLatch); 25 | t.setSender(sender); 26 | return t; 27 | } 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/SimperfCommandTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import simperf.Simperf; 4 | import simperf.command.SimperfCommand; 5 | import simperf.sample.thread.MessageSender; 6 | import simperf.sample.thread.SendMessageThread; 7 | import simperf.thread.SimperfThread; 8 | import simperf.thread.SimperfThreadFactory; 9 | 10 | public class SimperfCommandTest { 11 | static MessageSender sender = new MessageSender(); 12 | 13 | public static void main(String[] args) { 14 | sender.sleepTime = 10; 15 | String[] xx = new String[] { "-c", "1000", "-t", "10", "-i", "500", "-o", "20000" }; 16 | SimperfCommand simCommand = new SimperfCommand(xx); 17 | Simperf perf = simCommand.create(); 18 | if (perf == null) { 19 | System.exit(-1); 20 | } 21 | perf.start(new SimperfThreadFactory() { 22 | public SimperfThread newThread() { 23 | SendMessageThread t = new SendMessageThread(); 24 | t.setSender(sender); 25 | return t; 26 | } 27 | }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/SimperfHttpWriterTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import simperf.Simperf; 4 | import simperf.result.DefaultHttpWriter; 5 | import simperf.sample.thread.MessageSender; 6 | import simperf.sample.thread.SendMessageThread; 7 | import simperf.thread.SimperfThread; 8 | import simperf.thread.SimperfThreadFactory; 9 | 10 | public class SimperfHttpWriterTest { 11 | 12 | static MessageSender sender = new MessageSender(); 13 | 14 | /** 15 | * @param args 16 | */ 17 | public static void main(String[] args) { 18 | 19 | Simperf perf = new Simperf(10, 1000); 20 | perf.getMonitorThread().clearCallback(); 21 | perf.getMonitorThread().registerCallback(new DefaultHttpWriter("http://localhost/report.php")); 22 | 23 | sender.sleepTime = 10; 24 | 25 | perf.start(new SimperfThreadFactory() { 26 | public SimperfThread newThread() { 27 | SendMessageThread t = new SendMessageThread(); 28 | t.setSender(sender); 29 | return t; 30 | } 31 | }); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/SimperfTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import simperf.Simperf; 7 | import simperf.config.Constant; 8 | import simperf.result.StatInfo; 9 | import simperf.sample.thread.MessageSender; 10 | import simperf.sample.thread.SendMessageThread; 11 | import simperf.sample.util.StdAvg; 12 | import simperf.thread.Callback; 13 | import simperf.thread.MonitorThread; 14 | import simperf.thread.SimperfThread; 15 | import simperf.thread.SimperfThreadFactory; 16 | 17 | public class SimperfTest { 18 | static MessageSender sender = new MessageSender(); 19 | 20 | /** 21 | * @param args 22 | */ 23 | public static void main(String[] args) { 24 | 25 | Simperf perf = new Simperf(10, -1); 26 | perf.setMaxTps(10); 27 | sender.sleepTime = 100; 28 | perf.timeout(15000); 29 | perf.getMonitorThread().registerCallback(new Callback() { 30 | private List numbers = new ArrayList(); 31 | 32 | public void onStart(MonitorThread monitorThread) { 33 | 34 | } 35 | 36 | public void onMonitor(MonitorThread monitorThread, StatInfo statInfo) { 37 | if (!Constant.DEFAULT_NA.equals(statInfo.tTps)) { 38 | numbers.add(Double.valueOf(statInfo.tTps)); 39 | } 40 | } 41 | 42 | public void onExit(MonitorThread monitorThread) { 43 | System.out.println("##### STD. #### " + StdAvg.getStd(numbers) + " #####"); 44 | } 45 | }); 46 | perf.start(new SimperfThreadFactory() { 47 | public SimperfThread newThread() { 48 | SendMessageThread t = new SendMessageThread(); 49 | t.setSender(sender); 50 | return t; 51 | } 52 | }); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/SimperfTestCaseTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | import java.util.Random; 6 | 7 | import junit.framework.Assert; 8 | 9 | import org.junit.After; 10 | import org.junit.Before; 11 | import org.junit.Test; 12 | import org.slf4j.Logger; 13 | import org.slf4j.LoggerFactory; 14 | 15 | import simperf.annotations.AfterInvoke; 16 | import simperf.annotations.AfterRunTask; 17 | import simperf.annotations.BeforeInvoke; 18 | import simperf.annotations.BeforeRunTask; 19 | import simperf.annotations.Simperf; 20 | import simperf.annotations.WarmUp; 21 | import simperf.controllers.TimeSteppingThreadTrigger; 22 | import simperf.junit.SimperfTestCase; 23 | 24 | public class SimperfTestCaseTest extends SimperfTestCase { 25 | private static final Logger logger = LoggerFactory.getLogger(SimperfTestCaseTest.class); 26 | 27 | private SimpleDateFormat sdf; 28 | private Random rand; 29 | 30 | @Before 31 | public void before() { 32 | TimeSteppingThreadTrigger t = new TimeSteppingThreadTrigger(2000, 2); 33 | t.startWork(simperf); 34 | sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); 35 | rand = new Random(); 36 | logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.before()"); 37 | } 38 | 39 | @After 40 | public void after() { 41 | logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.after()"); 42 | } 43 | 44 | @BeforeInvoke 45 | public void beforeInvoke() { 46 | logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.beforeInvoke()"); 47 | } 48 | 49 | @AfterInvoke 50 | public void afterInvoke() { 51 | logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.afterInvoke()"); 52 | } 53 | 54 | @BeforeRunTask 55 | public void beforeRunTask() { 56 | logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.beforeRunTask()"); 57 | } 58 | 59 | @AfterRunTask 60 | public void afterRunTask() { 61 | logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.afterRunTask()"); 62 | } 63 | 64 | @WarmUp 65 | public void warmUp() { 66 | logger.debug(Thread.currentThread().getId() + "SimperfTestCaseTest.warmUp()"); 67 | } 68 | 69 | @Test 70 | @Simperf(thread = 2, count = 5, interval = 1000) 71 | public void testXxx() { 72 | try { 73 | Thread.sleep(1000); 74 | } catch (Exception e) { 75 | } 76 | sdf.format(new Date()); 77 | boolean result = rand.nextInt(10) > 1; 78 | logger.debug(Thread.currentThread().getId() + "=================="); 79 | Assert.assertTrue("xxxx", result); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/SteppingThreadTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/test/java/simperf/sample/SteppingThreadTest.java -------------------------------------------------------------------------------- /src/test/java/simperf/sample/TimeoutAbortTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/test/java/simperf/sample/TimeoutAbortTest.java -------------------------------------------------------------------------------- /src/test/java/simperf/sample/thread/MessageSender.java: -------------------------------------------------------------------------------- 1 | package simperf.sample.thread; 2 | 3 | import java.util.Random; 4 | 5 | public class MessageSender { 6 | public int sleepTime = 1000; 7 | Random rand = new Random(); 8 | 9 | public boolean send() { 10 | try { 11 | Thread.sleep(rand.nextInt(20)+50); 12 | } catch (Exception e) { 13 | } 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/thread/SendMessageClientThread.java: -------------------------------------------------------------------------------- 1 | package simperf.sample.thread; 2 | 3 | import simperf.client.ClientLatch; 4 | import simperf.client.SimperfClientThread; 5 | 6 | public class SendMessageClientThread extends SimperfClientThread { 7 | public SendMessageClientThread(ClientLatch clientLatch) { 8 | super(clientLatch); 9 | } 10 | 11 | MessageSender sender; 12 | 13 | public boolean runTask() { 14 | return sender.send(); 15 | } 16 | 17 | public void setSender(MessageSender sender) { 18 | this.sender = sender; 19 | } 20 | } -------------------------------------------------------------------------------- /src/test/java/simperf/sample/thread/SendMessageThread.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/test/java/simperf/sample/thread/SendMessageThread.java -------------------------------------------------------------------------------- /src/test/java/simperf/sample/ut/SimperfUnitTest.java: -------------------------------------------------------------------------------- 1 | package simperf.sample.ut; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | import simperf.util.SimperfUtil; 6 | 7 | public class SimperfUnitTest { 8 | @Test 9 | public void testX() { 10 | Assert.assertEquals(SimperfUtil.divide(4, 2), 1); 11 | } 12 | 13 | @Test 14 | public void testO() { 15 | Assert.assertEquals(SimperfUtil.divide(90, 30), "3.00"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/simperf/sample/util/StdAvg.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/test/java/simperf/sample/util/StdAvg.java -------------------------------------------------------------------------------- /src/test/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to CONSOLE. 2 | log4j.rootLogger=info, file 3 | 4 | # CONSOLE 5 | log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 6 | log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 7 | log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n 8 | 9 | log4j.appender.file.File=receive.log 10 | log4j.appender.file.MaxFileSize=10MB 11 | log4j.appender.file.MaxBackupIndex=10 12 | log4j.appender.file.layout=org.apache.log4j.PatternLayout 13 | log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n -------------------------------------------------------------------------------- /src/test/resources/relpay/second.log: -------------------------------------------------------------------------------- 1 | 1378186934000,11 2 | 1378186935000,4 3 | 1378186936000,10 4 | 1378186937000,9 5 | 1378186938000,14 6 | 1378186939000,15 7 | 1378186940000,11 8 | 1378186941000,13 9 | 1378186942000,17 -------------------------------------------------------------------------------- /src/test/resources/simperf_server.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imbugs/simperf/357047052d624c8a547b5e09ffbfee6d3e3bdc6a/src/test/resources/simperf_server.js --------------------------------------------------------------------------------