Changed createTeskTasks in TestFramework.scala to reuse TestRunner instance when running different TestDefinition.

This commit is contained in:
cheeseng 2013-04-05 15:20:04 +08:00
parent b2b9fb132a
commit d2e40c1c56
6 changed files with 82 additions and 7 deletions

View File

@ -0,0 +1,5 @@
scalaVersion := "2.10.1"
libraryDependencies += "org.scalatest" %% "scalatest" % "2.0.M6-SNAP15"
testOptions in Test += Tests.Argument("-r", "custom.CustomReporter")

View File

@ -0,0 +1,28 @@
package custom
import java.io._
import org.scalatest._
import events._
class CustomReporter extends Reporter {
private def writeFile(filePath: String, content: String) {
val file = new File(filePath)
val writer =
if (!file.exists)
new FileWriter(new File(filePath))
else
new FileWriter(new File(filePath + "-2"))
writer.write(content)
writer.flush()
writer.close()
}
def apply(event: Event) {
event match {
case runStarting: RunStarting => writeFile("target/RunStarting", "RunStarting")
case runCompleted: RunCompleted => writeFile("target/RunCompleted", "RunCompleted")
case _ =>
}
}
}

View File

@ -0,0 +1,12 @@
package com.test
import org.scalatest.Spec
class TestSpec extends Spec {
def `TestSpec-test-1 ` {}
def `TestSpec-test-2 ` {}
def `TestSpec-test-3 ` {}
}

View File

@ -0,0 +1,12 @@
package com.test
import org.scalatest.Spec
class TestSpec2 extends Spec {
def `TestSpec2-test-1 ` {}
def `TestSpec2-test-2 ` {}
def `TestSpec2-test-3 ` {}
}

View File

@ -0,0 +1,13 @@
#This test that the framework will only use a single runner instance to execute all tests.
#Because ScalaTest's runner will report RunStarting when the run start, a CustomReporter is
#used to report expected ScalaTest's RunStarting event by writing out to target/, it is then
#used to check for their existence, and if the expected event is fired > 1 (which is unexpected),
#a xxxx-2 file will be written, thus here we also check for 'absent' of such file.
> clean
> test
$ exists target/RunStarting
$ absent target/RunStarting-2

View File

@ -184,6 +184,12 @@ object TestFramework
private def createTestTasks(loader: ClassLoader, tests: Map[Framework, (Set[TestDefinition], Seq[String])], ordered: Seq[TestDefinition], log: Logger, listeners: Seq[TestReportListener]) =
{
val testsListeners = listeners collect { case tl: TestsListener => tl }
val runnerMap =
tests map { case (framework, (testDefinitions, testArgs)) =>
(framework, new TestRunner(framework, loader, testArgs.toArray, listeners, log))
}
def foreachListenerSafe(f: TestsListener => Unit): () => Unit = () => safeForeach(testsListeners, log)(f)
import TestResult.{Error,Passed,Failed}
@ -191,13 +197,12 @@ object TestFramework
val startTask = foreachListenerSafe(_.doInit)
val testTasks =
tests flatMap { case (framework, (testDefinitions, testArgs)) =>
val runner = new TestRunner(framework, loader, testArgs.toArray, listeners, log)
for(testDefinition <- testDefinitions) yield
{
val runTest = () => withContextLoader(loader) { runner.run(testDefinition) }
(testDefinition.name, runTest)
}
val runner = runnerMap(framework)
for(testDefinition <- testDefinitions) yield
{
val runTest = () => withContextLoader(loader) { runner.run(testDefinition) }
(testDefinition.name, runTest)
}
}
val endTask = (result: TestResult.Value) => foreachListenerSafe(_.doComplete(result))