├── .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 extends Annotation> 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
--------------------------------------------------------------------------------