示例测试场景
ActiveMQ Classic 性能模块
示例测试场景
此页面提供了一个关于我们想要做的事情的简单示例。
假设所有测试代码都位于单个 Maven POM 中(例如 activemq-integration-test 版本 4.0),它将处理所有类路径问题。
我们将尝试描述这可能工作的方式,并为每种实现方式命名,以便我们可以开始改进解决此问题的不同方法...
无头构建
在此版本中,没有“控制器”;每个构建都被视为完全独立的构建。
每个构建都知道该做什么;每个测试用例都会生成一个 XML 文件,该文件成为一个命名的部署工件。
例如,想象以下构建(实际上只是在 POM 中运行 Java 可执行文件以进行类路径)
框 | 描述 | 命令行 |
---|---|---|
hostB | 代理 | 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 | 代理 | 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);
}
}
因此,控制器构建中的这两个 JUnit 测试用例将分别在队列上启动 3 个独立的远程构建,并等待它们完成 - 或者终止它们