用于自定义 µtest 测试运行器的 Sbt 钩子
Sbt hook for custom µtest test runner
我在 Scala sbt 项目中使用 µtest。我想 运行 各种测试 classes 与自定义测试 运行ner,它由这样的代码组成
val results = AnotherClassWithTests.myTests.run()
println(results.leaves.count(_.value.isSuccess))
我希望它在 运行ning sbt 测试时执行,我发现的唯一方法是 extend utest.Testsuite 并将测试方法留空。
这样,sbt 会找到 class 和 运行 它,但解决方案似乎并不理想。我可以通过不扩展 utest.Testsuite 来阻止 sbt 的 运行ner 执行 AnotherClassWithTests
,但我仍然会从 µtests 默认测试 运行ner 中获得不必要的输出以及我的自己的输出。
我怎样才能在没有那个 hack 的情况下将我的 运行ner 连接到 sbt test
并且 运行 我所有的测试都用它,跳过默认的 µtests 运行ner?
我也可以访问 sbt 检测到的 µ-测试列表吗?
您可以完全覆盖 test
任务的行为,只执行您的主要任务 class。从 https://github.com/scala-js/scala-js/blob/v0.6.5/sbt-plugin/src/main/scala/scala/scalajs/sbtplugin/ScalaJSPluginInternal.scala#L547-L549
中汲取灵感
/** Run a class in a given environment using a given launcher */
def jsRun(env: JSEnv, cp: CompleteClasspath, mainCl: String,
launcher: VirtualJSFile, jsConsole: JSConsole, log: Logger) = {
log.info("Running " + mainCl)
log.debug(s"with JSEnv of type ${env.getClass()}")
log.debug(s"with classpath of type ${cp.getClass}")
// Actually run code
env.jsRunner(cp, launcher, log, jsConsole).run()
}
def launcherContent(mainCl: String) = {
val parts = mainCl.split('.').map(s => s"""["${escapeJS(s)}"]""").mkString
s"${CoreJSLibs.jsGlobalExpr}$parts().main();\n"
}
def memLauncher(mainCl: String) = {
new MemVirtualJSFile("Generated launcher file")
.withContent(launcherContent(mainCl))
}
test in Test := {
val mainClass = "path.to.AnotherClassWithTests"
jsRun((jsEnv in Test).value, (scalaJSExecClasspath in Test).value, mainClass,
memLauncher(mainClass), (scalaJSConsole in Test).value, streams.value.log)
}
要获取已检测到的测试列表,您可以使用 sbt 任务 (definedTests in Test).value
,或者 (definedTestNames in Test).value
。
我在 Scala sbt 项目中使用 µtest。我想 运行 各种测试 classes 与自定义测试 运行ner,它由这样的代码组成
val results = AnotherClassWithTests.myTests.run()
println(results.leaves.count(_.value.isSuccess))
我希望它在 运行ning sbt 测试时执行,我发现的唯一方法是 extend utest.Testsuite 并将测试方法留空。
这样,sbt 会找到 class 和 运行 它,但解决方案似乎并不理想。我可以通过不扩展 utest.Testsuite 来阻止 sbt 的 运行ner 执行 AnotherClassWithTests
,但我仍然会从 µtests 默认测试 运行ner 中获得不必要的输出以及我的自己的输出。
我怎样才能在没有那个 hack 的情况下将我的 运行ner 连接到 sbt test
并且 运行 我所有的测试都用它,跳过默认的 µtests 运行ner?
我也可以访问 sbt 检测到的 µ-测试列表吗?
您可以完全覆盖 test
任务的行为,只执行您的主要任务 class。从 https://github.com/scala-js/scala-js/blob/v0.6.5/sbt-plugin/src/main/scala/scala/scalajs/sbtplugin/ScalaJSPluginInternal.scala#L547-L549
/** Run a class in a given environment using a given launcher */
def jsRun(env: JSEnv, cp: CompleteClasspath, mainCl: String,
launcher: VirtualJSFile, jsConsole: JSConsole, log: Logger) = {
log.info("Running " + mainCl)
log.debug(s"with JSEnv of type ${env.getClass()}")
log.debug(s"with classpath of type ${cp.getClass}")
// Actually run code
env.jsRunner(cp, launcher, log, jsConsole).run()
}
def launcherContent(mainCl: String) = {
val parts = mainCl.split('.').map(s => s"""["${escapeJS(s)}"]""").mkString
s"${CoreJSLibs.jsGlobalExpr}$parts().main();\n"
}
def memLauncher(mainCl: String) = {
new MemVirtualJSFile("Generated launcher file")
.withContent(launcherContent(mainCl))
}
test in Test := {
val mainClass = "path.to.AnotherClassWithTests"
jsRun((jsEnv in Test).value, (scalaJSExecClasspath in Test).value, mainClass,
memLauncher(mainClass), (scalaJSConsole in Test).value, streams.value.log)
}
要获取已检测到的测试列表,您可以使用 sbt 任务 (definedTests in Test).value
,或者 (definedTestNames in Test).value
。