2016-01-08 7 views
0

Я попытался проверить пример пинг-понга (от minimal-akka-scala-seed активатора), используя как scalatest, так и specs2 (я сам сам тестировал specs2, см. Ниже).Спекуляции 2 тестов для минимально-акка-scala-семян активатора не выполняются

Скататель всегда проходит. Однако тесты specs2 не проходят все время (т. Е. Если я повторю те же тесты несколько раз). Когда он выходит из строя, он имеет следующий вывод:

[info] PingPongActorSpecs2 
    [info] 
    [info] A Ping actor in specs2 should should 
    [error] ! send back a ping on a pong 
    [error] assertion failed: expected PingMessage(ping), found PongMessage(pong) (TestKit.scala:339) 
    [error] akka.testkit.TestKitBase$class.expectMsg_internal(TestKit.scala:339) 
    [error] akka.testkit.TestKitBase$class.expectMsg(TestKit.scala:315) 
    [error] akka.testkit.TestKit.expectMsg(TestKit.scala:718) 
    [error] com.example.PingPongActorSpecs2$$anonfun$1$$anonfun$apply$1$$anon$1$$anonfun$2.apply(PingPongActor2Spec.scala:27) 
    [error] com.example.PingPongActorSpecs2$$anonfun$1$$anonfun$apply$1$$anon$1$$anonfun$2.apply(PingPongActor2Spec.scala:25) 
    [error] akka.testkit.TestKitBase$class.within(TestKit.scala:296) 
    [error] akka.testkit.TestKit.within(TestKit.scala:718) 
    [error] akka.testkit.TestKitBase$class.within(TestKit.scala:310) 
    [error] akka.testkit.TestKit.within(TestKit.scala:718) 
    [error] com.example.PingPongActorSpecs2$$anonfun$1$$anonfun$apply$1$$anon$1.<init>(PingPongActor2Spec.scala:25) 
    [error] com.example.PingPongActorSpecs2$$anonfun$1$$anonfun$apply$1.apply(PingPongActor2Spec.scala:23) 
    [error] com.example.PingPongActorSpecs2$$anonfun$1$$anonfun$apply$1.apply(PingPongActor2Spec.scala:23) 
    [info] 
    [info] A Pong actor in specs2 should should 
    [error] ! send back a pong on a ping 
    [error] assertion failed: expected PongMessage(pong), found PingMessage(ping) (TestKit.scala:339) 
    [error] akka.testkit.TestKitBase$class.expectMsg_internal(TestKit.scala:339) 
    [error] akka.testkit.TestKitBase$class.expectMsg(TestKit.scala:315) 
    [error] akka.testkit.TestKit.expectMsg(TestKit.scala:718) 
    [error] com.example.PingPongActorSpecs2$$anonfun$3$$anonfun$apply$2$$anon$2$$anonfun$4.apply(PingPongActor2Spec.scala:37) 
    [error] com.example.PingPongActorSpecs2$$anonfun$3$$anonfun$apply$2$$anon$2$$anonfun$4.apply(PingPongActor2Spec.scala:35) 
    [error] akka.testkit.TestKitBase$class.within(TestKit.scala:296) 
    [error] akka.testkit.TestKit.within(TestKit.scala:718) 
    [error] akka.testkit.TestKitBase$class.within(TestKit.scala:310) 
    [error] akka.testkit.TestKit.within(TestKit.scala:718) 
    [error] com.example.PingPongActorSpecs2$$anonfun$3$$anonfun$apply$2$$anon$2.<init>(PingPongActor2Spec.scala:35) 
    [error] com.example.PingPongActorSpecs2$$anonfun$3$$anonfun$apply$2.apply(PingPongActor2Spec.scala:33) 
    [error] com.example.PingPongActorSpecs2$$anonfun$3$$anonfun$apply$2.apply(PingPongActor2Spec.scala:33) 
    [info] 
    [info] 
    [info] Total for specification PingPongActorSpecs2 
    [info] Finished in 19 ms 
    [info] 3 examples, 0 failure, 2 errors 

Испытание specs2 I реализован следующим образом (очень похожи на scalatest in the test folder of the minimal-akka-scala-seed):

package com.example 

import org.specs2.mutable.SpecificationLike 
import org.specs2.specification.AfterAll 

import akka.actor.{ Actor, ActorSystem, Props } 
import akka.testkit.{ TestKit, ImplicitSender } 

class PingPongActorSpecs2(_system: ActorSystem) extends TestKit(_system) 
    with ImplicitSender 
    with SpecificationLike 
    with AfterAll { 
    import scala.concurrent.duration._ 

    def this() = this(ActorSystem("MySpec")) 

    override def afterAll { 
    TestKit.shutdownActorSystem(system) 
    } 

    lazy val waitTime = 1 seconds 

    "A Ping actor in specs2 should" >> { 
    "send back a ping on a pong" >> { 
     val pingActor = system.actorOf(PingActor.props) 
     within (waitTime) { 
      pingActor ! PongActor.PongMessage("pong") 
      expectMsg(PingActor.PingMessage("ping")) 
      true 
     } 
    } 
    } 

    "A Pong actor in specs2 should" >> { 
    "send back a pong on a ping" >> { 
     val pongActor = system.actorOf(PongActor.props) 
     within (waitTime) { 
      pongActor ! PingActor.PingMessage("ping") 
      expectMsg(PongActor.PongMessage("pong")) 
      true 
     } 
    } 
    } 
} 

зависимостей Моей библиотеки следующим образом:

scalaVersion := "2.11.6" 

lazy val akkaVersion = "2.3.13" 

lazy val scalaTestVersion = "2.2.4" 

lazy val specs2Version = "3.6" 

libraryDependencies ++= Seq(
    "com.typesafe.akka" %% "akka-actor" % akkaVersion, 
    "com.typesafe.akka" %% "akka-testkit" % akkaVersion % "test", 
    "org.scalatest" %% "scalatest" % scalaTestVersion % "test", 
    "org.specs2" %% "specs2-core" % specs2Version 
) 

Кто-нибудь знает, где я ввожу свои тесты specs2?

ответ

1

Спецификации Specs2 выполняют примеры одновременно, поэтому возможно, что ваши 2 примера взаимодействуют друг с другом. Вы можете создать одну систему в примере (дорого) или использовать sequential аргумент, чтобы ваши тесты выполняется последовательно:

class PingPongActorSpecs2(_system: ActorSystem) extends TestKit(_system) 
    with ImplicitSender 
    with SpecificationLike 
    with AfterAll { 

    import scala.concurrent.duration._ 
    sequential 

    ... 
} 
+0

Благодаря Эрик. Это работает. Ran с и без последовательного аргумента 20 раз каждый. При последовательном аргументе он проходит 20/20. Без последовательного аргумента он проходит 15/20. –

+0

Я также нашел из [ScalaTest doc] (http://doc.scalatest.org/2.2.4/index.html#org.scalatest.ParallelTestExecution), что обычный подход к проверке параллельных запусков наборов тестов для SASSALTEST заключается в том, чтобы запускать разные а также тесты одного набора последовательно. Поэтому это объясняет, почему скататель проходил все время. –

+0

Да, это действительно одно существенное различие между настройками по умолчанию ScalaTest и спецификациями2. Причиной одновременного дефолта в specs2 является поощрение тестирования изоляции в первую очередь. – Eric