当前位置: 首页 > 知识库问答 >
问题:

在Playframework启动之前启动testcontainers

阴鸿才
2023-03-14

我想在play应用程序(使用slick)启动之前,从docker compose文件(postgres和kafka实例)启动testcontainers。我想要这个,这样我就可以写一个端到端的测试。我似乎不明白这是怎么可能的。

import java.io.File
import com.dimafeng.testcontainers.DockerComposeContainer.ComposeFile
import com.dimafeng.testcontainers.{DockerComposeContainer, ForAllTestContainer}
import com.typesafe.config.ConfigFactory
import org.scalatest.{BeforeAndAfterAll, FunSpec}
import org.scalatestplus.play.guice.GuiceFakeApplicationFactory
import play.api.inject.guice.GuiceApplicationBuilder
import play.api.{Application, Configuration, Environment, Mode}

trait TestFunSpec extends FunSpec with BeforeAndAfterAll with GuiceFakeApplicationFactory {

  override def fakeApplication(): Application = new GuiceApplicationBuilder()
    .in(Environment(new File("."), getClass.getClassLoader, Mode.Test))
    .loadConfig(_ => Configuration(ConfigFactory.load("test.conf")))
    .build

}

class TestIntegrationSpec extends TestFunSpec with ForAllTestContainer {

  override val container = DockerComposeContainer(ComposeFile(Left(new File("docker-compose.yml"))))

  it("should test something") {

    assert(true)

  }
}

Scala版本2.12.10 Testcontainer版本0.35.0 Play slick版本5.0.0

当我在没有“TestFunSpec”的情况下执行测试时,docker-comuse会正确地旋转我的服务。当我在作用域中添加播放应用程序“TestFunSpec”时,应用程序会尝试启动,这样做时,它会尝试与postgres连接,postgres还不存在(因为测试容器是在之后启动的)。

提前通知。

更新:详细答案请参见答案部分。

共有1个答案

申屠浩歌
2023-03-14

在对游戏测试套件机制进行了深入研究后,我想出了一个可行的设置。

第1步,使用AppProvider定义您的测试容器套件:

import com.dimafeng.testcontainers.{Container, ForAllTestContainer}
import org.scalatest.Suite
import org.scalatestplus.play.AppProvider

trait PlayTestContainer extends Suite with AppProvider with ForAllTestContainer {

  override val container: Container

}

步骤2,创建一个抽象的PlayTestContainerIntegrationSpec,它扩展了上述特性:

import java.io.File
import com.typesafe.config.ConfigFactory
import org.scalatest.concurrent.{IntegrationPatience, ScalaFutures}
import org.scalatest.{BeforeAndAfterAll, BeforeAndAfterEach, TestData}
import org.scalatestplus.play.PlaySpec
import org.scalatestplus.play.guice.GuiceOneAppPerTest
import play.api.inject.guice.GuiceApplicationBuilder
import play.api.{Application, Configuration, Environment, Mode}

abstract class PlayTestContainerIntegrationSpec
    extends PlaySpec
    with PlayTestContainer
    with GuiceOneAppPerTest
    with ScalaFutures
    with IntegrationPatience
    with BeforeAndAfterEach
    with BeforeAndAfterAll {

  override def newAppForTest(testData: TestData): Application = application()

  def application(): Application =
    new GuiceApplicationBuilder()
      .in(Environment(new File("."), getClass.getClassLoader, Mode.Test))
      .loadConfig(_ => Configuration(ConfigFactory.load("test.conf")))
      .build
}

如您所见,我们包含了“PlayTestContainer”特性,并重写了“newAppForTest”函数来构建播放应用程序。

步骤3,创建一个特定的联调,扩展上面抽象的PlayTestContainerIntegrationSpec,并覆盖容器,以满足您的特定需求:

class TestIntegrationSpec extends PlayTestContainerIntegrationSpec {

  override val container = DockerComposeContainer(ComposeFile(Left(new File("docker-compose.yml"))))

  "should test something" in {

    assert(true === true)

  }
}

希望这有帮助。

 类似资料:
  • 大家好,我正在windows 7中使用xampp v3.2.1。我想在windows启动时自动启动它,但无法启动。 我尝试了这里提供的解决方案,但在服务中找不到任何东西。 我在D驱动器中安装了xampp,这就是为什么apache和mysql在从run打开services.msc时不显示在服务中的原因。 我已经从xampp控制面板的config(配置)按钮尝试过了,我选中了autostart(自动启

  • 本文向大家介绍冷启动和热启动之间的区别,包括了冷启动和热启动之间的区别的使用技巧和注意事项,需要的朋友参考一下 冷启动 冷启动是指在计算机处于关闭状态时通过按电源按钮来启动计算机。最初,初始化微处理器,然后读取ROM,然后启动系统引导过程。 暖启动 热启动是指使用重新启动按钮或使用CTRL + ALT + DELETE键命令组合重新启动系统。当系统停止响应或系统更新要求系统重新启动以使更新生效时,

  • XAMPP 3.2.1版安装在Windows 7上。它在Windows启动时没有自动启动。 尝试过:在中查看,它既不显示Apache也不显示MySQL。

  • 我们的webstart应用程序(不是小程序)遇到了奇怪的启动问题。 启动应用程序会显示应用程序启动屏幕,但javaws进程会在不久后终止,不会在对话框、java控制台或日志文件中显示任何错误消息。javaws似乎只是在实际启动实际应用程序之前停止。无论用户尝试从桌面快捷方式还是从网页启动应用程序,都无关紧要。当从本地计算机使用javaw运行而无需webstart时,相同的应用程序可以正常工作。 应

  • 在Spring应用程序启动时,我想在Redis中查找一个值,并根据该值关闭或保留消息侦听器。 完全不初始化这些bean也是可以的,但是我也找不到方法。 目前,我正在尝试使用Spring的关闭容器: 容器 消息侦听器: 问题是,如果我用已经在队列中的消息启动应用程序,消息侦听器将在执行之前拾取消息。 有办法实现我的目标吗?即使采用不同的方法

  • 问题内容: 我是Ubuntu的新手,我在Ubuntu 10.04中安装了XAMPP。当我启动XAMPP时,它说MySQL无法启动。 这是我的终端输出: 然后,当我转到时,我陷入了XAMPP初始屏幕,如果选择语言,则什么也不会发生。 问题答案: 我找到了答案。首先完全卸载lampp,然后重新安装。卸载之前,请使用以下命令停止lampp: 然后使用命令卸载/删除它 然后重新安装。