sbtテスト実行時におけるエラーメッセージの短縮表示方法
http://d.hatena.ne.jp/a-hisame/20100715/1279183871
ここで「sbtのテストエラー時のメッセージは例外のスタックトレースなので長い。何か良い方法は無いのかしら」と書いていたが、簡単(だが、あまり汎用的ではない)解決法を見つけたので記述しておく。
メッセージはプロジェクト内のLoggerに書き出されているので、そのメッセージを強制的に変更してしまうことで、この問題を解決する。具体的には以下のようなProjectファイルを使う。
// sbt version 0.7.4 import sbt._ class MyProject(info: ProjectInfo) extends DefaultProject(info) { val scalaTest = "org.scalatest" % "scalatest" % "1.0" protected override def logImpl: Logger = { val lg = new BufferedLogger( new ConsoleLogger { override def trace(t: => java.lang.Throwable) = { if( t.toString.indexOf("org.scalatest") != -1 ) { printLog("failed", t.toString) } else { super.trace(t) } } def printLog(label: => String, message: => String) { System.out.synchronized { System.out.print("[%s] %s".format(label, message)) System.out.println() } } } ) lg.setLevel(defaultLoggingLevel) lg } }
使用するloggerはProjectファイルのlogImplをoverrideして差し込むことで差し替えされる。
従来のソースコードでは、BufferedLoggerにinfo.logを差し込んでいたが、info.logはConsoleLoggerだったので、それを使わずに、新たにLoggerを作っておいた。
自分で使う限りでは、Console上に出力されるだけなので、困らないし。
この中でテストのトレースをするのがtraceメソッド。
ここで全てのtraceを書き換えると他の例外(例えばrun実行時の例外)のトレースまで表示されなくなるので、使用するテストフレームワークのテストの表示のみを短縮表示することにした。
ハードコーディングだけれど、別に自分で使う分にはいいよね。