使用 ScalaTest 和 Future 进行集成测试
Integration test with ScalaTest and Future
我正在尝试围绕异步方法构建我的应用程序,因此我将 Future 与 Scala 结合使用。更多信息,elastic4s lib为了查询Elasticsearch服务器。
我从这个模式开始,所以我首先创建了这个方法:
def insert(person: Person) = {
client.execute {
index into "index" / "type" source person
} onComplete {
case Success(s) => {
logger.info("{} has been inserted successfully", interaction.toString)
something_to_do()
}
case Failure(t) => logger.warn("An error has occured: {}", t.getMessage)
}
}
如果我理解得很好,这个方法是不可测试的。
当我阅读此 post 时,我必须创建一个 returns 未来的方法,并且我必须使用 ScalaFutures(用于 ScalaTest)来测试我的异步方法。
所以我执行了这个模式,并且创建了两个这样的方法:
def insert(person: Person): Future[IndexResponse] = {
client.execute {
index into "index" / "type" source person
}
}
def insertToEs(person: Person): Unit = {
insert(person) onComplete {
case Success(s) => {
logger.info("{} has been inserted successfully", person.toString)
something_to_do()
}
case Failure(t) => logger.warn("An error has occured: {}", t.getMessage)
}
}
所以现在可以很容易地测试我的第一个方法,但是我该如何测试 insertToEs 方法呢?
更一般地说,我想创建集成测试:Kafka(嵌入式)到 Elasticsearch(嵌入式)。
我有这段代码调用了之前的 insertToEs 方法:
def receive: Unit = {
...
val iterator = stream.iterator()
while(iterator.hasNext) {
insertToEs(iterator.next.message)
}
}
我已经在接收方法上创建了一个测试,但看起来集成测试在方法执行之前就结束了。
@RunWith(classOf[JUnitRunner])
class ToEsSpec extends FlatSpec with Matchers with BeforeAndAfterAll with ScalaFutures {
override def beforeAll = {
run_kafka_server
run_elasticsearch_server
}
override def afterAll = {
shutdown
}
it should "receive message from kafka and insert to es" {
send_to_kafka(json)
receive
assert if inserted in es
}
}
你能给我点建议吗?谢谢
见http://doc.scalatest.org/2.2.4/index.html#org.scalatest.concurrent.Futures
在我的一些测试用例中,我使用了:以下两种模式:
与未来
val actualFuture = ...
actualFuture.futureValue mustEqual ... //block until actualFuture isCompleted
使用异步,但没有 Future,我在一段时间内重复测试,直到成功或超时 http://doc.scalatest.org/2.2.4/index.html#org.scalatest.concurrent.Eventually
我正在尝试围绕异步方法构建我的应用程序,因此我将 Future 与 Scala 结合使用。更多信息,elastic4s lib为了查询Elasticsearch服务器。
我从这个模式开始,所以我首先创建了这个方法:
def insert(person: Person) = {
client.execute {
index into "index" / "type" source person
} onComplete {
case Success(s) => {
logger.info("{} has been inserted successfully", interaction.toString)
something_to_do()
}
case Failure(t) => logger.warn("An error has occured: {}", t.getMessage)
}
}
如果我理解得很好,这个方法是不可测试的。 当我阅读此 post 时,我必须创建一个 returns 未来的方法,并且我必须使用 ScalaFutures(用于 ScalaTest)来测试我的异步方法。
所以我执行了这个模式,并且创建了两个这样的方法:
def insert(person: Person): Future[IndexResponse] = {
client.execute {
index into "index" / "type" source person
}
}
def insertToEs(person: Person): Unit = {
insert(person) onComplete {
case Success(s) => {
logger.info("{} has been inserted successfully", person.toString)
something_to_do()
}
case Failure(t) => logger.warn("An error has occured: {}", t.getMessage)
}
}
所以现在可以很容易地测试我的第一个方法,但是我该如何测试 insertToEs 方法呢?
更一般地说,我想创建集成测试:Kafka(嵌入式)到 Elasticsearch(嵌入式)。
我有这段代码调用了之前的 insertToEs 方法:
def receive: Unit = {
...
val iterator = stream.iterator()
while(iterator.hasNext) {
insertToEs(iterator.next.message)
}
}
我已经在接收方法上创建了一个测试,但看起来集成测试在方法执行之前就结束了。
@RunWith(classOf[JUnitRunner])
class ToEsSpec extends FlatSpec with Matchers with BeforeAndAfterAll with ScalaFutures {
override def beforeAll = {
run_kafka_server
run_elasticsearch_server
}
override def afterAll = {
shutdown
}
it should "receive message from kafka and insert to es" {
send_to_kafka(json)
receive
assert if inserted in es
}
}
你能给我点建议吗?谢谢
见http://doc.scalatest.org/2.2.4/index.html#org.scalatest.concurrent.Futures
在我的一些测试用例中,我使用了:以下两种模式:
与未来
val actualFuture = ... actualFuture.futureValue mustEqual ... //block until actualFuture isCompleted
使用异步,但没有 Future,我在一段时间内重复测试,直到成功或超时 http://doc.scalatest.org/2.2.4/index.html#org.scalatest.concurrent.Eventually