]>
Dogcows Code - chaz/sbt-tap/blob - src/main/scala/SbtTapReporting.scala
1 import java
.io
.{PrintWriter
, StringWriter
, File
, FileWriter
}
3 import org
.scalatools
.testing
.{Event
=> TEvent
, Result
=> TResult
}
5 import java
.util
.concurrent
.atomic
.AtomicInteger
7 object SbtTapReporting
extends Plugin
{
8 def apply() = new SbtTapListener
12 * Listens to sbt test listener events and writes them to a tap compatible file. Results for all groups
13 * go to a single file although it might be desirable to generate one tap file per group.
15 * sbt runs tests in parallel and the protocol does not seem to provide a way to match a group to a test event. It
16 * does look line one thread calls startGroup/testEvent/endGroup sequentially and using thread local to keep
17 * the current active group might be one way to go.
19 class SbtTapListener
extends TestsListener
{
20 var testId
= new AtomicInteger(0)
21 var fileWriter
: FileWriter
= _
24 new File("test-results").mkdirs()
26 fileWriter
= new FileWriter(
27 scala
.util
.Properties
.envOrElse("SBT_TAP_OUTPUT", "test-results/test.tap")
31 def startGroup(name
: String
) {
32 writeTapFields("#", "start", name
)
35 def endGroup(name
: String
, result
: TestResult
.Value
) {
36 writeTapFields("#", "end", name
, "with result", result
.toString
.toLowerCase
)
39 def endGroup(name
: String
, t
: Throwable
) {
40 writeTapFields("#", "end", name
)
43 def testEvent(event
: TestEvent
) {
44 event
.detail
.foreach
{ e
: TEvent
=>
46 case TResult
.Success
=> writeTapFields("ok", testId
.incrementAndGet(), "-", e
.testName())
47 case TResult
.Error
| TResult
.Failure
=>
48 writeTapFields("not ok", testId
.incrementAndGet(), "-", e
.testName())
49 // According to the TAP spec, as long as there is any kind of whitespace, this output should belong to the
50 // the test that failed and it should get displayed in the UI.
51 // TODO:It would be nice if we could report the exact line in the test where this happened.
52 writeTapFields(" ", stackTraceForError(e
.error()))
53 case TResult
.Skipped
=>
54 // it doesn't look like this framework distinguishes between pending and ignored.
55 writeTapFields("ok", testId
.incrementAndGet(), e
.testName(), "#", "skip", e
.testName())
60 override def doComplete(finalResult
: TestResult
.Value
) {
61 writeTapFields("1.." + testId
.get
)
65 private def writeTapFields(s
: Any
*) {
66 fileWriter
.write(s
.mkString("", " ", "\n"))
70 private def stackTraceForError(t
: Throwable
): String
= {
71 val sw
= new StringWriter()
72 val printWriter
= new PrintWriter(sw
)
73 t
.printStackTrace(printWriter
)
This page took 0.038032 seconds and 5 git commands to generate.