如 果想要模擬多執行緒同時存取某個方法,可以使用LoadTest,同 樣地,它為TestCase作裝飾(或說為Test介面的實作類別作裝飾),你可以直接指定要啟動幾個執行緒來進行測試:
Test loadTest = new LoadTest(new
BookDAOImplPerfTest("testGet"), 10);
以上例而言,若執行測試時,會啟用10個執行緒來呼叫BookmarkDAOImplPerfTest的testGet()方 法進行測試,你可以搭配TimedTest來測試,在多個執行緒下,是否每次呼叫都在指定時間內完成。例如:
package test.cc.openhome;
import com.clarkware.junitperf.LoadTest;
import com.clarkware.junitperf.TimedTest;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import cc.openhome.dao.BookmarkDAO;
import cc.openhome.dao.BookmarkDAOImpl;
import cc.openhome.model.Bookmark;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class BookDAOImplPerfTest extends TestCase {
private BookmarkDAO dao;
public BookDAOImplPerfTest(String name) throws Exception {
super(name);
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/exercise");
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.getConnection().close(); // 為了先載入驅動程式
dao = new BookmarkDAOImpl(dataSource);
}
public void testGet() {
dao.get();
}
public void testAdd() {
Bookmark bookmark = new Bookmark("http://m", "n", "o");
dao.add(bookmark);
}
public static Test suite() throws Exception {
int threadCount = 50;
int timeout = 1500;
Test getLoadTest = new LoadTest(
new BookDAOImplPerfTest("testGet"), threadCount);
Test addLoadTest = new LoadTest(
new BookDAOImplPerfTest("testAdd"), threadCount);
TestSuite suite = new TestSuite();
suite.addTest(new TimedTest(getLoadTest, timeout));
suite.addTest(new TimedTest(addLoadTest, timeout));
return suite;
}
}
如果使用JUnit 4.x, 但想借助LoadTest來進行多執行緒下的測試,可以使用JUnit4TestAdapter來轉接。例如:
package test.cc.openhome;
import junit.framework.JUnit4TestAdapter;
import org.junit.Before;
import org.junit.Test;
import com.clarkware.junitperf.LoadTest;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import cc.openhome.dao.BookmarkDAO;
import cc.openhome.dao.BookmarkDAOImpl;
import cc.openhome.model.Bookmark;
public class BookDAOImplPerfTest {
private BookmarkDAO dao;
@Before
public void setUp() throws Exception {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/exercise");
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.getConnection().close(); // 為了先載入驅動程式
dao = new BookmarkDAOImpl(dataSource);
}
@Test(timeout = 1500)
public void testGet() {
dao.get();
}
@Test(timeout = 1500)
public void testAdd() {
Bookmark bookmark = new Bookmark("http://m", "n", "o");
dao.add(bookmark);
}
public static junit.framework.Test suite() {
return new LoadTest(
new JUnit4TestAdapter(BookDAOImplPerfTest.class), 50);
}
}
如果想設定執行緒的啟動時隔,則可以使用com.clarkware.junitperf.Timer的 實作物件。例如ConstantTimer可以指定的固定時隔,逐一 啟動執行緒:
int threadCount = 50;
Timer timer = new ConstantTimer(100);
Test getLoadTest = new LoadTest(
new BookDAOImplPerfTest("testGet"), threadCount, timer);
Timer timer = new ConstantTimer(100);
Test getLoadTest = new LoadTest(
new BookDAOImplPerfTest("testGet"), threadCount, timer);
RandomTimer可以指定時隔與變異數作為依據, 產生隨機時隔:
int threadCount = 50;
Timer timer = new RandomTimer(100, 10);
Test getLoadTest = new LoadTest(
new BookDAOImplPerfTest("testGet"), threadCount, timer);
Timer timer = new RandomTimer(100, 10);
Test getLoadTest = new LoadTest(
new BookDAOImplPerfTest("testGet"), threadCount, timer);
你可以重複進行測試。例如每100毫秒一個執行緒,共50個執行緒進行測試,並重複20次,看看測試是否都在1500毫秒內完成:
int delay = 100;
int threadCount = 50;
int iter = 20;
int timeout = 1500;
Timer timer = new ConstantTimer(delay);
Test getLoadTest = new LoadTest(
new BookDAOImplPerfTest("testGet"), threadCount, iter, timer);
Test timedTest = new TimedTest(getLoadTest, timeout);
int threadCount = 50;
int iter = 20;
int timeout = 1500;
Timer timer = new ConstantTimer(delay);
Test getLoadTest = new LoadTest(
new BookDAOImplPerfTest("testGet"), threadCount, iter, timer);
Test timedTest = new TimedTest(getLoadTest, timeout);
在以下的程式中:
Test loadTest = new LoadTest(new
BookDAOImplPerfTest("testGet"), 10);
10個執行緒都使用同一個BookmarkImplPerfTest實例,如果你希望每個執行緒各使用一個BookmarkImplPerfTest 實例,可以使用TestMethodFactory。例 如:
Test factory = new
TestMethodFactory(BookmarkImplPerfTest.class, "testGet");
Test loadTest = new LoadTest(factory, 10);
Test loadTest = new LoadTest(factory, 10);
如果要每個執行緒都各使用BookmarkImplPerfTest實例,並自動呼叫testXXX()方法,可以使用TestFactory:
Test factory = new
TestFactory(BookmarkImplPerfTest.class, "testGet");
Test loadTest = new LoadTest(factory, 10);
Test loadTest = new LoadTest(factory, 10);
你還可以參考 JUnitPerf官方網站 的說明,了解如何有效地撰寫JUnitPerf測試。