并行运行嵌入式Kafka spring启动测试



我有一些在内部使用Kafka的spring启动测试。对于Kafka功能,我在使用Kafka的每个测试类上使用@EmbeddedKafka注释(每个测试上使用相同的服务器,localhost:9092)。

@SpringBootTest
@DirtiesContext
@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" })
class SampleIntegrationTest extends Base integration test {
// code
}

当我在测试套件中单独或顺序运行测试时,测试通过,但当我并行运行测试套件时失败junit-platform.properties设置:

junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = same_thread
junit.jupiter.execution.parallel.mode.classes.default = concurrent

获取资源访问异常在一些测试中。是否有某种方法可以使这些测试与@EmbeddedKafka并行运行?

还要提一下,一些与Kafka相关的集成测试内部发送相同主题上的数据.

谢谢。

当并行运行测试时,您会遇到资源访问异常,因为多个测试试图使用相同的Kafka代理端口(9092)和相同的主题。为了避免这些冲突,你可以为每个测试创建一个独特的Kafka代理和主题。

要实现这一点,您可以为每个测试使用动态端口和唯一主题。

更新@EmbeddedKafka注释以使用动态端口:

@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:0" })

EmbeddedKafkaBroker实例注入到测试类中,并使用动态分配的端口配置Kafka生产者和消费者:

@SpringBootTest
@DirtiesContext
@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:0" })
class SampleIntegrationTest extends BaseIntegrationTest {
@Autowired
private EmbeddedKafkaBroker embeddedKafkaBroker;
@BeforeEach
void setUp() {
Map<String, Object> producerProps = KafkaTestUtils.producerProps(embeddedKafkaBroker);
// configure your Kafka producer using producerProps
Map<String, Object> consumerProps = KafkaTestUtils.consumerProps("testGroup", "true", embeddedKafkaBroker);
// configure your Kafka consumer using consumerProps
}
// code
}

为每个测试使用唯一的主题。您可以为每个测试生成唯一的主题名称,而不是使用硬编码的主题名称:

class SampleIntegrationTest extends BaseIntegrationTest {
private String uniqueTopic;
@BeforeEach
void setUp() {
uniqueTopic = UUID.randomUUID().toString();
// ...
}
// code
}

相关内容

  • 没有找到相关文章

最新更新