TIL: Testcontainers에서 호스트에 연결

TL;DR: Testcontainers allows you to expose a host's port to containers using Testcontainers.exposeHostPorts(localServerPort);.



짧은 알림: 석사 논문의 경우 Twitter 계정을 자동화하기 위해 Selenium 도커 컨테이너로 작업해야 합니다. 최근 작업은 컨테이너 내부에서 실행되는 Chrome 브라우저에서 사용해야 하는 프록시를 지정할 수 있도록 하는 것이었습니다. 그렇게 하면 계정의 진정한 출처에 대해 Twitter를 속이려고 합니다. 이는 특히 동일한 시스템에서 동시에 여러 계정을 자동화하려는 경우에 유용합니다.

프록시 설정은 Proxy API for Extensions에 액세스하는 JavaScript 코드와 함께 Selenium의 JavascriptExecutor.executeScript(..) 메서드를 사용하여 수행해야 하지만(자세한 내용은 spring-selenium-pool의 예제를 참조하십시오), 마침내 내 설정을 테스트하고 싶었습니다.

모의 프록시 서버로 MockServer을 사용하기로 결정했습니다. 스텁 응답을 정의하는 것처럼 Java/Kotlin과의 통합이 쉽습니다. 그러나 마지막 질문은 다음과 같습니다. Selenium 컨테이너 내부에서 호스트에서 실행 중인 MockServer에 어떻게 연결할 수 있습니까?

운 좋게도 Testcontainers 사람들이 나를 덮었습니다. documentation이 답을 제공했습니다: Testcontainers.exposeHostPorts(localServerPort); .

그게 우리에게 필요한 전부입니다. 컨테이너가 시작되기 전에 해당 행을 실행해야 하지만 모의 서버가 실행된 후에 실행하십시오.

그러면 호스트는 host.testcontainers.internal + 임의의 로컬 포트의 컨테이너 내부에서 사용할 수 있습니다.

내가 이해한 것은 ssh-컨테이너를 통해 관심 컨테이너의 모든 TCP 트래픽을 호스트로 라우팅하기 위해 port forwarding을 사용하는 ssh-server로 다른 Docker 컨테이너를 시작하는 것입니다.

결국 결과 테스트의 골격은 다음과 같습니다.

@SpringBootTest(classes = [TaskWithProxyTest.App::class],
        webEnvironment = SpringBootTest.WebEnvironment.NONE,
        properties = ["selenium.pool.size=1"])
class TaskWithProxyTest {

    // causes the container from spring-selenium-pool to come up
    @SpringBootApplication
    class App

    companion object {

        lateinit var mockProxy: ClientAndServer

        @BeforeAll
        @JvmStatic
        fun first() {
            val mockServerPort = SocketUtils.findAvailableTcpPort()
            mockProxy = startClientAndServer(mockServerPort)

            // necessary to access mockserver from container
            Testcontainers.exposeHostPorts(mockServerPort)
        }

        @AfterAll
        @JvmStatic
        fun tearDown() {
            mockProxy.stop(true)
        }
    }

    @Test
    fun `your test`() {
        // ...
    }
}

좋은 웹페이지 즐겨찾기