MongoDB atlas 容器未与测试容器分离

问题描述 投票:0回答:1

我们正在转向 mongodb atlas,我已经开始使用 mongodb/mongodb-atlas-local 容器进行本地开发,它绑定到端口 27017:27017。现在我想更新我们的集成测试以使用新容器,但我有一些奇怪的行为。这是我有效的旧代码,有一些额外的代码,因此它作为副本集启动,以便我可以测试使用事务的函数

@pytest.fixture(autouse=True, scope="session")
def init_mongo_get_uri():
    mongo_container = DockerContainer("mongo:latest")
    mongo_bind_port = randint(a=30000, b=40000)

    mongo_container.with_name("python_testing_mongodb")
    mongo_container.with_exposed_ports(mongo_bind_port)
    mongo_container.with_bind_ports(container=mongo_bind_port, host=mongo_bind_port)
    mongo_container.with_command(f"--port={mongo_bind_port} --replSet=rs")
    mongo_container.start()

    # normally the stuff above would be enough but we need to start the container with replica set to be able to test functions that use transactions
    # starting with replica set takes a second so we need to wait for the container to be ready
    mongo_uri = f"mongodb://localhost:{mongo_bind_port}/?replicaSet=rs"
    max_attempts = 10
    for attempt in range(max_attempts):
        exit_code, output = mongo_container.exec(
            "mongosh --quiet --eval=\"rs.initiate({_id:'rs',members:[{_id:0,host:'localhost:%s'}]})\" mongodb://localhost:%s" % (
                mongo_bind_port, mongo_bind_port)
        )

        if exit_code == 0:
            # If the command succeeds, break the loop
            break
        else:
            # Wait for 1 second before retrying
            sleep(1)

        if attempt == max_attempts - 1:
            # If we reach the last attempt and still fail, raise an error
            raise RuntimeError("Replica set didn't get setup properly after 10 seconds")

    yield mongo_uri

    mongo_container.stop()



@pytest.fixture(scope="session")
def test_app(init_mongo_get_uri):
    # Additional check to ensure the MongoDB container URI is not None
    if not init_mongo_get_uri:
        raise RuntimeError("MongoDB Testcontainer URI is None in test_app fixture.")

    # Setup the MongoDBSingleton with the container URI
    MongoDBSingleton._instance = None
    MongoDBSingleton(uri=init_mongo_get_uri, db_name="testdb")
    #start flask app

现在 mongodb/mongodb-atlas-local 镜像默认使用副本集,所以据说不需要所有额外的东西。

@pytest.fixture(autouse=True, scope="session")
def init_mongo_get_uri():
    mongo_container = DockerContainer("mongodb/mongodb-atlas-local")
    mongo_bind_port = randint(a=30000, b=40000)

    mongo_container.with_name("python_testing_mongodb")
    mongo_container.with_bind_ports(container=27017, host=mongo_bind_port)
    mongo_container.start()

    mongo_uri = f"mongodb://localhost:{mongo_bind_port}"

    yield mongo_uri

    mongo_container.stop()



@pytest.fixture(scope="session")
def test_app(init_mongo_get_uri):
# same as before

我对 mongo 或 docker 或两者的了解都让我失望,因为即使新的集成测试针对不同主机端口上的 testcontainer 运行,我仍然看到 testdb 出现在我的本地 dev 27017:27017 容器中,并且如果我停止带调试的测试我可以使用指南针连接到端口 37017 上的测试容器,我也会在那里看到我的本地数据库。

我尝试将 atlas testcontainer 绑定到 27017 以外的其他容器,但似乎不允许。

我缺少什么才能运行测试容器而不“污染”我的开发容器?我本以为拥有不同的主机端口就足够了。

谢谢

编辑 看来当我的本地开发数据库关闭时,我根本无法访问测试数据库,除非我在 27017:27017 上运行它。

mongodb docker flask mongodb-atlas testcontainers
1个回答
0
投票

像往常一样,尽管尝试了几个小时,但我一寻求帮助就解决了。我不确定细节,也许有人可以照亮我,但是如果我将连接字符串更改为

mongo_uri = f“mongodb://localhost:{mongo_bind_port}/?directConnection=true”

它按预期工作,我可以在其他容器不运行的情况下运行我的测试,并且即使两个容器同时运行,我也看不到 testdb 出现在我的本地开发容器中。

© www.soinside.com 2019 - 2024. All rights reserved.