在SBT

时间:2016-09-05 23:20:16

标签: scala sbt scalatest scalacheck

我使用了几个测试框架(ScalaTest和ScalaCheck)获得了一个SBT项目。在大多数情况下,这只是按预期工作。例如。运行测试会运行两种测试版本。

libraryDependencies ++= Seq(
  ...
  "org.scalatest"    %% "scalatest"    % "2.2.4"  % "test",
  "org.scalacheck"   %% "scalacheck"   % "1.12.5" % "test"
)

但是当运行仅限测试时,当我尝试向ScalaCheck提供参数时,ScalaTest会介入并抱怨:

test-only *SomeProp -- -s 10
  

[error](test:testOnly)java.lang.IllegalArgumentException:指定   套件(-s)或嵌套套件(-i)不是   从sbt运行ScalaTest时支持;请使用sbt的测试版   代替。

在上面的示例中,使用 -s 参数而不是ScalaCheck调用了ScalaTest。

查看ScalaTest的测试指纹:

superclass is "org.scalatest.Suite" or annotated with: "org.scalatest.WrapWith"

和ScalaCheck:

superclass is either "org.scalacheck.Properties" or "org.scalacheck.Prop"

我认为SBT在给定上述指纹的情况下针对给定类型的测试运行哪个框架应该没有混淆。 (* SomeProps变体扩展org.scalacheck.P​​roperties。)

我有什么方法可以指定使用仅测试调用哪个测试框架?如果不是,我是否需要配置SBT以在不同的配置中运行ScalaTest和ScalaCheck?

1 个答案:

答案 0 :(得分:0)

我设法通过为基于属性的测试(ScalaCheck)创建单独的配置来实现这一点。我在下面解释了对build.sbt的更改。

我将ScalaTest保留为测试配置中的“默认”测试框架:

pandas

我创建了一个单独的 prop 配置来运行ScalaCheck属性。我必须将所有基于属性的测试从 src / test / scala 移到 src / prop / scala 。我还将我的ScalaCheck依赖项限定为 prop 配置。这使它仅在 prop 配置中使用时才可用。同样,ScalaTest只能在测试配置中使用。

libraryDependencies ++= Seq(
  ...
  "org.scalatest"    %% "scalatest"    % "2.2.4"  % "test"
)

现在我可以使用参数同时运行ScalaTest和ScalaCheck而不会出现任何问题。所以基本上测试仅测试运行ScalaTest,而 prop:test prop:仅测试运行ScalaCheck。

lazy val root =
  Project("root", file(".")).
    configs(Prop).
    settings(inConfig(Prop)(Defaults.testSettings)).
    settings(libraryDependencies += scalacheck)

lazy val Prop = config("prop") extend (Runtime)

lazy val scalacheck = "org.scalacheck"   %% "scalacheck"   % "1.12.5" % "prop"

有关如何设置测试配置的更多信息,请参阅SBT documentation

唯一的缺点是我无法再运行测试来运行所有测试。我不得不诉诸:

test-only *Spec -- -z "some content" //runs only ScalaTest

prop:test-only *SomeProp -- -s 10 //runs only ScalaCheck

为上述内容创建别名会使事情变得更容易。