對(duì)方法進(jìn)行多線程測(cè)試ThreadTestDateUtil
雖然通過(guò)了單元測(cè)試,這個(gè)方法的功能實(shí)現(xiàn)了,但在多線程并發(fā)調(diào)用該方法的時(shí)候會(huì)出現(xiàn)拋出異常。手寫多線程并發(fā)測(cè)試代碼,com.loggingselenium.ThreadTestDateUtil繼承java.lang.Thread線程類,重新實(shí)現(xiàn)其run()方法,用于調(diào)用com.loggingselenium.DateUtil類的compareDateTime(String dateTime1, String dateTime2)。在main()方法中創(chuàng)建兩個(gè)線程并啟動(dòng)線程執(zhí)行調(diào)用日期時(shí)間比較的方法。
package com.loggingselenium;
public class ThreadTestDateUtil extends Thread {
public void run() {
int i1=DateUtil.compareDateTime("20130111 01:02:03","20130111 01:02:03");
int i2=DateUtil.compareDateTime("20120111 01:02:03","20130111 01:02:03");
System.out.println("i1="+i1);
System.out.println("i2="+i2);
}
public static void main(String a[]) {
Thread t = new ThreadTestDateUtil();
t.start();
Thread t2 = new ThreadTestDateUtil();
t2.start();
}
}
編譯、運(yùn)行該方法,控制臺(tái)報(bào)異常:
java.lang.RuntimeException: 解析日期時(shí)間格式出錯(cuò),期望的字符串格式為[yyyyMMdd HH:mm:ss]
at DateUtil.compareDateTime(DateUtil.java:43)
at TestDateUtil2.run(TestDateUtil2.java:3)
使用JUnitPerf進(jìn)行多線程測(cè)試JUnitPerfTestDateUtil
我們手寫多線程并發(fā)測(cè)試代碼的一個(gè)弊端是,如果我們需要測(cè)試100個(gè)線程,我們需要?jiǎng)?chuàng)建100個(gè)線程實(shí)例Thread t,t1,t2,t3……并一一啟動(dòng)這些線程。JunitPerf包可以幫助我們更容易對(duì)代碼進(jìn)行多線程并發(fā)測(cè)試。
首先,訪問(wèn)http://www.clarkware.com/software/junitperf-1.9.1.zip下載我們需要的junitperf-1.9.1.jar,放到我們單元測(cè)試項(xiàng)目的構(gòu)建路徑。
在測(cè)試代碼com.loggingselenium. UnitTestDateUtil的基礎(chǔ)上進(jìn)行修改,創(chuàng)建新測(cè)試類JUnitPerfTestDateUtil,以使用JunitPerf進(jìn)行多線程并發(fā)測(cè)試。新測(cè)試類中compareDateTimeLoadTestMethod()實(shí)現(xiàn)以5個(gè)線程執(zhí)行testCompareDateTime(),這個(gè)單元測(cè)試方法調(diào)用我們的日期時(shí)間比較方法。方法compareDateTimeLoadTestMethod()只會(huì)運(yùn)行1次,會(huì)有5個(gè)線程運(yùn)行方法testCompareDateTime(),等于有5個(gè)線程調(diào)用方法compareDateTime(String dateTime1, String dateTime2)。我們可以指定需要的線程數(shù)目,JunitPerf也提供了豐富的接口供我們選用。
package com.loggingselenium;
import com.clarkware.junitperf.LoadTest;
import com.clarkware.junitperf.TestMethodFactory;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class JUnitPerfTestDateUtil extends TestCase {
public JUnitPerfTestDateUtil(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void CompareDateTime() {
String dateTime1 = "20120111 01:02:03";
String dateTime2 = "20130111 01:02:03";
String dateTime3 = "20130111 01:02:03";
assertEquals(-1, DateUtil.compareDateTime(dateTime1, dateTime2));
assertEquals(1, DateUtil.compareDateTime(dateTime2, dateTime1));
assertEquals(0, DateUtil.compareDateTime(dateTime2, dateTime3));
}
protected static Test compareDateTimeLoadTestMethod() {
int users = 5;
Test factory = new TestMethodFactory(JUnitPerfTestDateUtil.class,
"CompareDateTime");
Test loadTest = new LoadTest(factory, users);
return loadTest;
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(compareDateTimeLoadTestMethod());
return suite;
}
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
}