開發效能測試工具——自己動手實現迭代功能
阿新 • • 發佈:2019-01-31
在用Jmeter進行效能測試時也許有人遇到過這樣的問題:
測試時TPS相當大,一臺,二臺負載機都找不到拐點,最後準備好多臺負載機才解決問題,而且管理這些機器時比較麻煩。
我們能不能解決這些問題呢?當然可以,我們可以自動動手來實現一個迭代器。之所以能夠高效,是因為我們去掉了測試工具的諸多輔助功能。
比如實時計算當前TPS、平均響應時間;記錄日誌等待工作,所以能夠更快。
廢話少說,下面實現一個簡單的迭代器,以備不時之需。
1.定義一個介面,說明要做什麼;參照Junit與LoadRunner Java Vuser來定義。
package com.seling.thread; public interface BaseTask extends Runnable { /** * 初始化操作 */ public void init(); /** * 具體迭代的內容,要執行的測試程式放在此方法中,可以有入參 * @param i */ public String action(int i); /** * 收尾工作 */ public void end(); }
2.實現介面程式,也就是具體任務內容。
3.開啟多個執行緒來執行任務</pre><pre name="code" class="java">package com.seling.thread; import org.apache.log4j.Logger; import com.seling.test.UserDaoI; import com.seling.test.UserDaoImpl; public abstract class Task implements BaseTask { private static Logger log = Logger.getLogger(Task.class); private String threadNo;//入參示例,這裡傳入執行緒號,實際可參與物件 private UserDaoI ud;//此測待測試的介面 /** * 通過構造方法來初始化入參 * @param thread */ public Task(String thread){ this.threadNo = thread; } @Override public abstract void run(); @Override public void init() { // TODO Auto-generated method stub log.info("init "+this.threadNo); ud = new UserDaoImpl(); } @Override public String action(int i) { // TODO Auto-generated method stub log.info("action "+this.threadNo+" iterator "+i); //System.out.println("action "+this.threadNo+" iterator "+i); //測試ud.getUserById()介面 return ud.getUserById(this.threadNo+"-"+i);//這個是我們要測試的介面主法 } @Override public void end() { // TODO Auto-generated method stub } }
package com.seling.thread; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import org.apache.log4j.Logger; public class TestTask extends Task { private static Logger log = Logger.getLogger(TestTask.class); private static AtomicLong totalfailRecords = new AtomicLong(0); private static AtomicLong totalPassRecords = new AtomicLong(0); private static int runTime = 30000 ;//測試執行時長,單位毫秒 public TestTask(String thread) { super(thread); } /** * 開5個執行緒執行任務,平時測試中開啟多少個執行緒自己決定 * * @param args */ public static void main(String args[]) { for (int i = 1; i <= 5; i++) { new Thread(new TestTask("t" + i)).start();//開啟執行緒執行任務 } } @Override public void run() { this.init(); int i = 0; boolean ifRun = true; long start = System.currentTimeMillis(); while (ifRun) { String user = this.action(i++); if (null != user)//驗證事務是否成功 totalPassRecords.incrementAndGet(); else totalfailRecords.incrementAndGet(); // 模擬ThinkTime,單位毫秒,對於TPS過萬的介面建議不用模擬ThinkTime try { TimeUnit.MILLISECONDS.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); long runInstance = end - start; if(runInstance >= runTime){ ifRun = false; //執行完之後計算TPS System.out.println("Duration(ms): " + (runInstance)); System.out.println("---------------------------------------------"); System.out.println("pass trasactions : " + totalPassRecords.get()); System.out.println("fail trasactions : " + totalfailRecords.get()); System.out.println("TPS: " + totalPassRecords.get() / (runInstance / 1000)); System.out.println("---------------------------------------------"); Thread.currentThread().stop(); } //log.info("Fail trasactions : " + totalfailRecords.get()); //log.info("Pass trasactions : " + totalPassRecords.get()); //System.out.println("Iterator : " + totalPassRecords.get()); } } }
程式碼貼完,上面只是簡單的實現了一個迭代功能。
如果對於入參有更多要求,下面幾個思路可以作參考:
1.下面入參改為傳物件
public TestTask(String thread) {
super(thread);
}
2.可以在init()方法中從檔案中獲取引數
3.在TestTask定義新的方法專門用來生成引數
最後附上UserDaoI介面及實現。
UserDaoI:不能再簡單了,純為了演示而用
package com.seling.test;
public interface UserDaoI {
public String getUserById(String id);
public void inOrModifyUser(UserInfo userInfo);
public void delUser(String id);
}
UserDaoImpl:
package com.seling.test;
public class UserDaoImpl implements UserDaoI {
@Override
public String getUserById(String id) {
// TODO Auto-generated method stub
return id;
}
@Override
public void inOrModifyUser(UserInfo userInfo) {
// TODO Auto-generated method stub
System.out.println(userInfo.getUserName());
}
@Override
public void delUser(String id) {
// TODO Auto-generated method stub
System.out.println("del "+id);
}
}
UserInfo:
package com.seling.test;
public class UserInfo {
private String userId;
private String userName;
private String address;
private String tele;
private boolean male;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTele() {
return tele;
}
public void setTele(String tele) {
this.tele = tele;
}
public boolean isMale() {
return male;
}
public void setMale(boolean male) {
this.male = male;
}
}
見笑