我们有标准目录结构的标准SBT项目。
test 文件夹包含所有JUnit测试。
我们引入了一个新文件夹 othertests ,文件夹 othertests 与文件夹 测试
othertest 文件夹包含一些特殊的测试用例。文件夹 othertest 中的测试类名称可以很容易地与普通的JUnit测试区分开来。
以下是我的build.sbt配置。
我已使用javaSources in Test
SBT任务在测试源中添加了文件夹 othertest 。
我们正在使用 激活器 来运行测试并执行其他操作。
当我运行activator> test
时,我希望仅运行 test 文件夹中的所有测试,并且我想从文件夹 othertests 。另外。
问题。
以下是我的build.sbt配置
import java.io.PrintStream
import play.sbt.PlayJava
import play.twirl.sbt.Import._
name := "Service"
version := "5.1.0"
scalaVersion := "2.11.8"
routesGenerator := InjectedRoutesGenerator
lazy val ContractTest = config("contract") extend(Test)
def contractTestFilter(name: String): Boolean = name endsWith "ContractTest"
def ignoreContractTest(name: String): Boolean = !contractTestFilter(name)
lazy val root = (project in file("."))
.enablePlugins(PlayJava)
.configs(ContractTest)
.settings(
inConfig(ContractTest) (Defaults.testTasks),
javaSource in Test := { (baseDirectory in Test) (_ / "contracttest") }.value,
testOptions in ContractTest := Seq(Tests.Filter(contractTestFilter),Tests.Argument(TestFrameworks.JUnit, "-q", "-v", "-s")),
testOptions in Test := Seq(Tests.Filter(ignoreContractTest),Tests.Argument(TestFrameworks.JUnit, "-q", "-v", "-s"))
)
lazy val xyz = taskKey[Unit]("custom task to create loglayout jar file under lib folder")
xyz := {
LogLayoutJar.build(scalaBinaryVersion.value, streams.value.log)
}
run := (run in Runtime).dependsOn(xyz).evaluated
javaOptions in Test ++= Seq("-Dconfig.resource=applic.tt.cnf")
libraryDependencies ++= Seq(
json,
javaWs,
"org.mockito" % "mockito-all" % "1.10.19" % Test,
"org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test,
"org.easytesting" % "fest-assert" % "1.4" % Test,
"org.scalactic" %% "scalactic" % "2.2.0",
"org.jmockit" % "jmockit" % "1.9" % Test,
"com.portingle" % "slf4jtesting" % "1.0.0" % Test,
"org.scalacheck" %% "scalacheck" % "1.12.6" % Test
)
resolvers ++= Seq(
"Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
)
parallelExecution in Test := runningTestInParallel
testGrouping in Test := groupByModule((externalDependencyClasspath in Test).value,
(definedTests in Test).value, streams.value.log)
javacOptions ++= Seq(
"-Xlint:unchecked",
"-Xlint:deprecation"
)
scalacOptions ++= Seq(
"-feature",
"-language:implicitConversions",
"-deprecation"
)
// Custom tasks //
val silenceSystemErr = taskKey[Unit]("Replaces System.err with a PrintStream to nowhere.")
silenceSystemErr := {
System.setErr(new PrintStream(new DevNull))
println("Messages System.err will not be printed.")
}
val restoreSystemErr = taskKey[Unit]("Restores the original System.err")
restoreSystemErr := {
System.setErr(systemErr)
println("Messages System.err will be printed.")
}
从jenkins我们使用以下命令运行测试 -
bin/activator -Dsbt.log.noformat=true -Denvironment_name=test -DsuppressLogging=true clean silenceSystemErr jacoco:cover
谢谢 勒凯什
答案 0 :(得分:1)
1
你自相矛盾。如果您在运行javaSources in Test
命令时不希望它们运行,为什么要添加Test
?
您应该创建[扩展Test
的[附加测试配置| http://www.scala-sbt.org/0.13/docs/Testing.html#Additional+test+configurations]并仅在othertests
文件夹中运行测试。
2
您可以创建另一个模块。我个人不喜欢这个想法因为那时我必须根据它测试的内容命名模块,我有两个独立的模块,实际上只应该是一个。
如果测试中有一些依赖项会降低模块的总体构建时间,那么单独的测试模块可能是个好主意。例如,想象一下带有Gatling性能测试的Java项目。如果性能测试在同一个模块中,那么每当我rebuild
它时,它也会rebuild
需要scala编译器的加速测试更慢。
有些人可以忍受这个,我就是其中之一。我更喜欢在同一个项目中进行测试,并且在重建模块时可能会遭受时间损失。这很少发生我在需要时创建不同的测试配置。
为测试选择单独模块的另一个原因是,当您的测试依赖于多个模块并且您不希望在编译时该模块依赖于src
代码。
某些IDE和/或语言可能会鼓励使用单独的模块进行测试,因为我理解C#和Visual Studio的情况(但我可能在这里错了,不要相信我的话)。