14

sbtからscalatestを実行すると、出力が混同されます。scalatestは、すべてのテスト実行とコメントを出力し、途中のどこかで統計を出力します。

> test
[info] Compiling 1 Scala source to /home/platon/Tor/scala-dojo-02/target/scala-2.9.1/classes...
[info] FunsWithListsTests:
[info] - should return list of labels
[info] - should return the average rating of games belonging to Zenga
[info] - should return the total ratings of all games
[info] - should return the total ratings of EA games *** FAILED ***
[info]   0 did not equal 170 (FunsWithListsTests.scala:35)
[error] Failed: : Total 8, Failed 5, Errors 0, Passed 3, Skipped 0
[info] - should increase all games rating by 10 *** FAILED ***
[error] Failed tests:
[error]     dojo.FunsWithListsTests
[info]   List() did not equal List(Game(Activision,40), Game(Zenga,70), Game(Zenga,20), Game(EA,70), Game(EA,120)) (FunsWithListsTests.scala:40)
[info] - should decrease all Zenga games rating by 10 *** FAILED ***
[info]   List() did not equal List(Game(Activision,30), Game(Zenga,50), Game(Zenga,0), Game(EA,60), Game(EA,110)) (FunsWithListsTests.scala:45)
[info] - should create function to find Activision games *** FAILED ***
[info]   List(Game(Activision,30), Game(Zenga,60), Game(Zenga,10), Game(EA,60), Game(EA,110)) did not equal List(Game(Activision,30)) (FunsWithListsTests.scala:50)
[info] - should return a List of tuples consisting of game label and game *** FAILED ***
[info]   List() did not equal List((ACTIVISION,Game(Activision,30)), (ZENGA,Game(Zenga,60)), (ZENGA,Game(Zenga,10)), (EA,Game(EA,60)), (EA,Game(EA,110))) (FunsWithListsTests.scala:56)
[error] {file:/home/platon/Tor/scala-dojo-02/}default-940f03/test:test: Tests unsuccessful
[error] Total time: 1 s, completed Mar 20, 2012 9:27:13 AM

たくさんのテストを積み上げていくと、それらの統計や失敗したテストを探すのが面倒になるようです。

これを修正する方法はありますか?

4

2 に答える 2

7

その理由は、SBTがデフォルトで、maven-surefire-pluginと同じようにテストを並行して実行するためです。

ScalaTest wikiで説明されているように、これは次の方法で解決できます。

テストの並列実行を無効にするデフォルトでは、sbtはすべてのタスクを並列で実行します。各テストはタスクにマップされているため、デフォルトではテストも並行して実行されます。テストの並列実行を無効にするには:

parallelExecution in Test := false
于 2012-05-08T14:40:39.260 に答える
0

同じ問題があり、ログを別々のファイルに保存することで解決しました。理想的ではありませんが、CIには適しています。特に、長時間実行される統合テストの場合はそうです。私がそれをした方法:

  1. ログ用の特別なディレクトリを作成します(たとえば、build.sbtの最後に)。

    lazy val logDirectory = taskKey[File]("A directory for logs")
    logDirectory := {
      val r = target.value / "logs"
      IO.createDirectory(r)
      r
    }
    
  2. [オプション]プロジェクトの要約情報のファイルを指定します。

    testOptions in test += Tests.Argument(
      TestFrameworks.ScalaTest, "-fW", (logDirectory.value / "summary.log").toString
    )
    

    Wは色を無効にします

  3. テストごとにグループを作成します。各グループは、特別な引数を使用してフォークされたJVMでテストを実行する必要があります。

    testGrouping in test := testGrouping.value.flatMap { group =>
      group.tests.map { suite =>
        val fileName = {
          // foo.bar.baz.TestSuite -> f.b.b.TestSuite
          val parts = suite.name.split('.')
          (parts.init.map(_.substring(0, 1)) :+ parts.last).mkString(".")
        }
    
        val forkOptions = ForkOptions(
          bootJars = Nil,
          javaHome = javaHome.value,
          connectInput = connectInput.value,
          outputStrategy = outputStrategy.value,
          runJVMOptions = javaOptions.value ++ Seq(
            "-Dour.logging.appender=FILE",
            s"-Dour.logging.dir=${logDirectory.value / fileName}"
          ),
          workingDirectory = Some(baseDirectory.value),
          envVars = envVars.value
        )
    
        group.copy(
          name = suite.name,
          runPolicy = Tests.SubProcess(forkOptions),
          tests = Seq(suite)
        )
      }
    }
    

    ログバックは、 our.logging.appenderour.logging.dirを介してログを保存する場所に通知できることに注意してください。

  4. ロギングの構成を作成します(test / resources / logback-test.xml):

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <target>System.out</target>
            <encoder>
                <pattern>%date{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{26} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <appender name="FILE" class="ch.qos.logback.core.FileAppender">
            <file>${our.logging.dir}/test.log</file>
            <append>false</append>
            <encoder>
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{26} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <root level="TRACE">
            <appender-ref ref="${our.logging.appender}"/>
        </root>
    </configuration>
    

それで全部です。

于 2017-11-11T19:27:46.783 に答える