範例測試情境
ActiveMQ Classic 效能模組
範例測試情境
此頁面提供一個我們想做的事情的簡單範例。
假設所有的測試程式碼目前都在單一的 Maven POM 中 (例如 activemq-integration-test 版本 4.0),這將處理所有的類別路徑問題。
我們會嘗試描述其不同的運作方式,並為每個實作風格命名,以便我們開始修改不同的方法來解決這個問題…
無頭建置
在此版本中,沒有「控制器」;每個建置都被視為完全獨立的建置。
每個建置都知道要做什麼;每個測試案例都會產生一個 XML 檔案,該檔案會成為一個具名的部署成品。
例如,想像以下建置 (這些建置實際上只是在 POM 中執行 Java 可執行檔以處理類別路徑)
方塊 | 描述 | 命令列 |
---|---|---|
hostB | Broker(訊息代理器) | java org.apache.activemq.broker.console.Main tcp://$hostA:61616 |
hostC | 消費者 | java org.apache.activemq.test.ConsumerMain –message-count=5000 –queue=true –destination=org.foo.bar tcp://$hostA:61616 |
hostD | 生產者 | java org.apache.activemq.test.ProducerMain –message-count=5000 –queue=true –destination=org.foo.bar tcp://$hostA:61616 |
在上面的範例中 - 每個建置都必須等待其他東西啟動一段時間。例如,生產者和消費者想要保持連線到訊息代理器約 5 分鐘,因為它們可以以任何順序啟動。
理想情況下,我們可能希望將其作為 3 個 maven 命令執行,如下所示…
mvn activemq:broker
mvn activemq:perf-producer -Dmessage-count=5000 -Dqueue=true -Ddestination=org.foo.bar -Durl=tcp://$hostA:61616
mvn activemq:perf-consumer -Dmessage-count=5000 -Dqueue=true -Ddestination=org.foo.bar -Durl=tcp://$hostA:61616
控制器建置
控制器版本的想法是,其中一個測試 (第一個啟動以嘗試協助) 嘗試協調測試節點之間的運作。
例如,我們可以先啟動控制器…
方塊 | 描述 | 命令列 |
---|---|---|
hostA | 控制器 | mvn test |
然後測試案例會啟動這些程序,同時與它們溝通…
方塊 | 描述 | 命令列 |
---|---|---|
hostB | Broker(訊息代理器) | java org.apache.activemq.broker.console.Main tcp://$hostA:61616 |
hostC | 消費者 | java org.apache.activemq.test.ConsumerMain –message-count=5000 –queue=true –destination=org.foo.bar tcp://$hostA:61616 |
hostD | 生產者 | java org.apache.activemq.test.ProducerMain –message-count=5000 –queue=true –destination=org.foo.bar tcp://$hostA:61616 |
控制器工廠建置
很快地,我們將會啟動大量的建置。我們可能希望單一專案建置多種不同的測試套件。每個單一分散式整合/系統/效能測試可能有多個要執行的子建置 (程序)。
因此,我們可能希望執行單一的 JUnit 測試案例,該測試案例會啟動不同的遠端建置/程序。
例如:
public class PerformanceTestSuite {
public void testSmallMessages() {
buildQueue.start("broker", "");
buildQueue.start("consumer", "--messageCount=1000");
buildQueue.start("producer", "--messageCount=1000");
buildQueue.join(5 * MINUTES);
}
public void testLargeMessages() {
buildQueue.start("broker", "");
buildQueue.start("consumer", "--messageCount=1000 --messageSize=1M");
buildQueue.start("producer", "--messageCount=1000 --messageSize=1M");
buildQueue.join(10 * MINUTES);
}
}
因此,控制器建置中的這 2 個 JUnit 測試案例將各自在佇列中啟動 3 個獨立的遠端建置,並等待它們完成 - 或終止它們。