一个测试容器用于多个测试

Posted

技术标签:

【中文标题】一个测试容器用于多个测试【英文标题】:One testcontainers for multiple tests 【发布时间】:2021-01-17 00:25:32 【问题描述】:

我在 scala 上,我有多个针对不同类(测​​试套件)的测试文件,每个测试文件都使用测试容器(来自同一个脚本的初始化)。

当我在项目中启动所有测试时,所有测试都失败了(由于 testContainers 导致与数据库的连接问题)。

当我单独启动测试时,所有测试都成功。

有没有办法只为多个测试文件(测试套件)启动一个容器? TestContainerForAll 似乎只适用于同一文件中的测试。


@Matthias Berndt 回复后编辑

我正在使用的库:

"org.scalatest" %% "scalatest" % "3.0.8" "com.dimafeng" %% "testcontainers-scala-scalatest" % "0.38.1" "com.dimafeng" %% "testcontainers-scala-postgresql" % "0.38.1"

这里是我的代码


trait DAOTest extends ForAllTestContainer 
  this: Suite =>

  override val container: PostgreSQLContainer = PostgreSQLContainer()
  container.container.withInitScript("extractData.sql")

  container.start()
  ConfigFactory.invalidateCaches()
  System.setProperty("jdbc.url", container.jdbcUrl)
  ConfigFactory.invalidateCaches()



【问题讨论】:

这个问题太草率了。没有指定使用的测试框架(必须从来自 testcontainers-scala 的 TestContainerForAll 类推断 ScalaTest)。没有显示你在做什么的代码。没有说明问题的错误消息。所以投反对票。 按照您的建议更新 干得好。然而现在的问题是:嵌套套件没有解决什么问题? 【参考方案1】:

其中一个选项是(用 java 术语)创建一个抽象基类,将容器声明为静态变量并在测试中扩展该类。在这种情况下,容器只会在基类加载时创建一次。

【讨论】:

投反对票,因为 Scala 中没有静态变量,并且此解决方案在运行测试后不会关闭容器。【参考方案2】:

假设您使用的是 Scalatest,应该可以使用嵌套套件。我将在这里使用 mysql 作为示例,因为这就是 testcontainers-scala 使用的:

class MysqlSpec extends FlatSpec with ForAllTestContainer 

  override val container = MySQLContainer()

  override def nestedSuites = Vector(
    new SomeDatabaseTest(container)
  )

class SomeDatabaseTest(container: MySQLContainer) extends FlatSpec 
  it should "do something" in 
    // do stuff with the container
  

【讨论】:

以上是关于一个测试容器用于多个测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在负载测试中将一个数据源用于多个测试用例

用于测试的多个版本的 Android 应用程序

任何支持多个RPC协议的测试工具或框架,用于测试不同的组件

ExpectedException 是不是用于在一种测试方法中测试多个案例?

csharp 用于嘲弄的Umbraco测试容器

用于单元测试的多个 App.config [重复]