Scala 如何使用SBT在测试配置之间共享类
我已按照SBT文档中的说明设置测试配置。我有三种测试配置test、IntegrationTest和AcceptanceTest。我的src目录如下所示:Scala 如何使用SBT在测试配置之间共享类,scala,sbt,Scala,Sbt,我已按照SBT文档中的说明设置测试配置。我有三种测试配置test、IntegrationTest和AcceptanceTest。我的src目录如下所示: src/ 接受/ 斯卡拉/ 它/ 斯卡拉/ 试验/ 斯卡拉/ 我的问题是,如何配置SBT以允许在这些配置之间共享类?示例:我在“it”配置中有一个类,用于简化数据库设置和拆卸。我在“acceptance”配置中的一个验收测试可以使用这个类。如何使“it”类可用于“验收”中的测试 非常感谢。SBT使用 它将识别src/test
- src/
- 接受/
- 斯卡拉/
- 它/
- 斯卡拉/
- 试验/
- 斯卡拉/
- 接受/
src/test/scala
下的文件夹,以便与src/main/scala
一起编译
因此,如果您移动src/test/scala
SBT下的其他文件夹,SBT将编译它们,您可以在它们之间共享代码。e、 g:
└── scala
├── acceptance
│ └── scala
│ └── Acceptance.scala
├── it
│ └── scala
│ └── IT.scala
└── Test.scala
运行
sbt test
将编译目录中的所有三个文件。因此,通过这种接受,可以参考并创建一个新的IT类。这里记录了一种方法:一个配置可以扩展另一个配置以使用该配置的依赖项和类。例如,本节显示了自定义配置的以下定义:
lazy val FunTest = config("fun") extend(Test)
lazy val AcceptanceTest = config("acceptance") extend(IntegrationTest)
extend
部分意味着编译的正常测试源将位于fun
源的类路径上。在您的情况下,声明接受
配置以扩展它
配置:
lazy val FunTest = config("fun") extend(Test)
lazy val AcceptanceTest = config("acceptance") extend(IntegrationTest)
如果您希望坚持使用预定义的配置,而不是定义新的配置,并且由于
Test
和IntegrationTest
扩展运行时(人们希望IntegrationTest
扩展测试),您可以使用以下选项:
dependencyClasspath in IntegrationTest := (dependencyClasspath in IntegrationTest).value ++ (exportedProducts in Test).value
这将把您在Test
中定义的所有类放在IntegrationTest
classpth上
##编辑:
由于@mjhoy:
lazy val DeepIntegrationTest = IntegrationTest.extend(Test)
这是唯一的办法吗?我确实喜欢不同配置提供的分离。我以这种方式构建它,这样sbt测试将运行单元测试,sbt it:test将运行集成测试,sbt验收:test将运行验收测试。没有其他方法可以让it类进入验收类路径?不,我不认为这是唯一的方法。您必须将自定义源路径和类路径添加到构建中。在build.sbt
文件中添加scalaSource-in-Test:=文件(“src/acceptance/scala”)
和scalaSource-in-Test:=文件(“src/it/scala”)
,将在运行Test
时编译这些路径。太棒了!这正是我想要的。谢谢。这肯定让我走上了正确的道路。这就是我最终的诀窍:AcceptanceTest Seq中的非托管源目录(base/“src/acceptance/scala”,base/“src/it/scala.scala”)}
如何定义AcceptanceTest
啊。。。这要简单得多。非常感谢。但它们也将作为测试运行和编译,所以您需要具有相同的类路径,这似乎不适合我。AcceptanceTest无法从IntegrationTest中找到类。从那以后有什么变化吗?上次当我发布一个没有好例子的url时,它被无情地删除了:)关于这一点的一个注释。这个解决方案不适用于我的VSCode/Metals集成(尽管sbt编译得很好)。我在这里找到了解决办法:这好多了!我使用“黑客”解决方案已经有一段时间了。也许当我第一次提出它时,ConfigurationExtra.extend
没有实现?或者也许我到目前为止还不知道。无论如何,谢谢@mjoy!