きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

GradleのtestLogging

testLoggingの初期値(LogLevel別)

調べたことを表にまとめるとこうだった。

debuginfolifecyclewarnquieterror
events STARTED×××××
PASSED×××××
SKIPPED××××
FAILED ×××
STANDARD_OUT××××
STANDARD_ERROR××××
displayGranularity222222
maxGranularity-1-1-1-1-1-1
minGranularity0-1-1-1-1-1
showExceptionstruetruetruetruetruetrue
showCausestruetruetruetruetruetrue
showStackTracestruetruetruetruetruetrue
exceptionFormatFULLFULLSHORTFULLFULLFULL
stackTraceFilters ENTRY_POINT××××××
TRUNCATE×
GROOVY××××××
showStandardStreamstruetruefalsefalsefalsefalse
これを受けて、やりたいことについて少し考えてみる。

テストの開始ログが欲しい

lifecycleだとテストが動いてるのか止まっているのか良くわからない。
仮に初期値のままやるのであれば、gradle --debugとか頭おかしいことをすることになる。
では、lifecycleのeventsにSTARTEDを加えるのか?
それだとテストメソッドごとにログがでてきて憤死する。
せめて、テストクラスごとにログがでてくれればいい。
そういうときって、TestタスクのbeforeSuiteを書けばできそうだ。

test {
    beforeSuite { desc ->
        logger.lifecycle("{} {}",desc.name, tasks.testing.logging.TestLogEvent.STARTED)
    }
}

あと、gradle --infoのときはテストメソッドの開始ログ、終了ログを出してやろう。
でも、標準出力と標準エラーはごめんこうむりたい。

test {
    testLogging { 
        info {
            events "started","passed","skipped","failed"

       }
    }
}

lifecycleだけexceptionFormat=SHORTなのは嫌

test {
    exceptionFormat "FULL"
}

もしくは

test {
    testLogging {
        lifecycle {
            exceptionFormat "FULL"
        }
    }
}

テスト結果の統計を見たい

何もしなくてもTestタスク全体の統計はでるけど、テストクラス単位のも出してみるか。
そういう時はafterSuiteを使う。
ちょっと懲りすぎかもしれないがこういうコード。

test {
    afterSuite { desc, result ->
        def event = tasks.testing.logging.TestLogEvent.FAILED
        def level = logging.LogLevel.ERROR
        if( tasks.testing.TestResult.ResultType.SUCCESS == result.resultType ){
            event = tasks.testing.logging.TestLogEvent.PASSED
            level = logging.LogLevel.LIFECYCLE
        } else if ( tasks.testing.TestResult.ResultType.SKIPPED == result.resultType ){
            event = tasks.testing.logging.TestLogEvent.SKIPPED
            level  = logging.LogLevel.WARN
        }
    
        logger.log(level, "{} {} total={} passed={} skipped={} failed={} elapse={} sec", desc.className, event, result.testCount, result.successfulTestCount, result.skippedTestCount, result.failedTestCount, (result.endTime - result.startTime)/1000)
    }
}

stackTraceFiltersをかけたくない

情報がどの程度落ちてるのか分からないが、全部出させたい。フィルターを外してしまおう。

test {
    testLogging {
        lifecycle {
            stackTraceFilters=[]
        }
    }
}

gradleがテストの途中でJUnitxmlを生成してくれてないので、スタックトレースくらいは早めに見て、とっとと解析をしたい。



さすがにiPhoneで書くの辛かった。
書き間違えしてるかも。