Получение тестконтейнеров, работающих с зефиром - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь заставить тестовый контейнер python работать с зефиром для запуска теста, но я не могу заставить его работать. Я всегда получаю соединение отказано при запуске теста. Я создал движок sqlalchemy и протестировал его, и он отлично работает, но при передаче строки соединения testcontainer в виде конфигурации с маршмеллоу он просто не работает. Ниже мой базовый тестовый класс.

class BaseTestCase(TestCase):
    base_url = '/api/v1'

    def create_app(self):
        config = MySqlContainer('mysql:8.0.19')
        with config as mysql:
            print(mysql.get_connection_url())
            e = sqlalchemy.create_engine(mysql.get_connection_url())
            result = e.execute("select version()")
            for row in result:
                print("Printing::::::::::::::::::::::" + str(row))
            result.close()
            logging.getLogger('connexion.operation').setLevel('ERROR')
            connex_app = connexion.App(__name__, specification_dir='../../api/')
            connex_app.app.json_encoder = JSONEncoder
            connex_app.add_api('static/openapi.yaml')
            app = connex_app.app
            app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
            app.config['SQLALCHEMY_DATABASE_URI'] = mysql.get_connection_url()
            app.config['LOG_LEVEL'] = 'DEBUG'

            bcrypt.init_app(app)
            db.init_app(app)
            ma.init_app(app)

            print("Finished setting up")

            return app

Я могу заставить это работать, когда я использую sqlite в качестве строки подключения.

class BaseTestCase(TestCase):
    base_url = '/api/v1'

    def create_app(self):
        class Config:
            PORT = 5000
            SQLALCHEMY_TRACK_MODIFICATIONS = False
            FLASK_ENV = 'local'
            SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
            LOG_LEVEL = 'DEBUG'

        logging.getLogger('connexion.operation').setLevel('ERROR')
        connex_app = connexion.App(__name__, specification_dir='../../api/')
        connex_app.app.json_encoder = JSONEncoder
        connex_app.add_api('static/openapi.yaml')
        app = connex_app.app
        app.config.from_object(Config)
        bcrypt.init_app(app)
        db.init_app(app)
        ma.init_app(app)

        print("Finished setting up test")

        return app

Любая помощь будет высоко ценится.

Пол

1 Ответ

0 голосов
/ 16 апреля 2020

Я решил использовать testcontainers.compose, и кажется, что строка подключения работает.

class BaseTestCase(TestCase):
    base_url = '/api/v1'

    def create_app(self):
        self.compose = testcontainers.compose.DockerCompose(".")
        self.compose.start()
        time.sleep(10)

        class Config:
            PORT = 3306
            SQLALCHEMY_TRACK_MODIFICATIONS = False
            FLASK_ENV = 'local'
            SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:password@0.0.0.0:3306/test-db'
            LOG_LEVEL = 'DEBUG'

        logging.getLogger('connexion.operation').setLevel('ERROR')
        connex_app = connexion.App(__name__, specification_dir='../../api/')
        connex_app.app.json_encoder = JSONEncoder
        connex_app.add_api('static/openapi.yaml')
        app = connex_app.app
        app.config.from_object(Config)
        bcrypt.init_app(app)
        db.init_app(app)
        ma.init_app(app)

        print("Finished setting up test")

        return app
...