scalatest-embedded-kafka 使用教程
项目介绍
scalatest-embedded-kafka 是一个提供内存中 Kafka 实例的库,用于运行您的测试。截至版本 1.1.1,该库不再依赖于 ScalaTest,并且不会在您的构建中传递性地引入 ScalaTest。该库灵感来源于 kafka-unit。scalatest-embedded-kafka 可在 Bintray 和 Maven Central 上获取,支持 Scala 2.11 和 2.12。Scala 2.10 支持到 0.10.0,Scala 2.12 从 0.11.0 开始支持,遵循 Apache Kafka 发布周期。目前不支持 Scala 2.13-Mx,因为 Kafka 工件未针对这些版本发布。从 1.0.0 版本开始,版本匹配它们构建的 Kafka 版本。
项目快速启动
添加依赖
在您的 build.sbt
文件中添加以下依赖:
libraryDependencies += "net.manub" %% "scalatest-embedded-kafka" % "2.0.0" % "test"
编写测试
使用 ScalaTest 编写一个简单的测试用例:
import net.manub.embeddedkafka.EmbeddedKafka
import org.scalatest.WordSpec
class MySpec extends WordSpec with EmbeddedKafka {
"runs with embedded kafka" should {
"work" in {
withRunningKafka {
// 在这里编写需要运行 Kafka 实例的代码
}
}
}
}
应用案例和最佳实践
测试 Kafka 消费者
使用 withRunningKafka
测试 Kafka 消费者:
import net.manub.embeddedkafka.Codecs._
import net.manub.embeddedkafka.ConsumerExtensions._
import net.manub.embeddedkafka.{EmbeddedKafka, EmbeddedKafkaConfig}
import org.scalatest.WordSpec
class KafkaConsumerTest extends WordSpec with EmbeddedKafka {
"A Kafka consumer" should {
"consume messages from a topic" in {
implicit val config = EmbeddedKafkaConfig(kafkaPort = 6001, zooKeeperPort = 6000)
withRunningKafka {
publishToKafka("test-topic", "key", "value")
val consumer = consumeLazily[String, String]("test-topic").take(1).toList
consumer should be(Seq("key" -> "value"))
}
}
}
}
最佳实践
- 明确配置:在测试中明确指定 Kafka 和 Zookeeper 的端口,避免端口冲突。
- 资源管理:使用
withRunningKafka
确保 Kafka 实例在测试结束后正确关闭。 - 代码复用:将常用的测试逻辑封装成辅助函数,提高代码复用性。
典型生态项目
scalatest-embedded-kafka-streams
scalatest-embedded-kafka-streams 是一个建立在 scalatest-embedded-kafka 之上的库,用于简化 Kafka Streams 的测试。它负责实例化和启动您的流,并在运行测试用例后关闭它们。
添加依赖
在您的 build.sbt
文件中添加以下依赖:
libraryDependencies += "net.manub" %% "scalatest-embedded-kafka-streams" % "2.0.0" % "test"
编写测试
import net.manub.embeddedkafka.streams.EmbeddedKafkaStreamsAllInOne
import org.apache.kafka.streams.StreamsBuilder
import org.scalatest.WordSpec
class KafkaStreamsTest extends WordSpec with EmbeddedKafkaStreamsAllInOne {
"A Kafka Streams application" should {
"process data correctly" in {
val builder = new StreamsBuilder()
val source = builder.stream[String, String]("input-topic")
source.to("output-topic")
val topology = builder.build()
runStreams(Seq("input-topic", "output-topic"), topology) {
publishToKafka("input-topic", "key", "value")
val consumer = consumeLazily[String, String]("output