Сконфигурируйте Selenium для использования тестовой базы данных pytest в приложении django так, чтобы CI поддерживался - PullRequest
0 голосов
/ 21 февраля 2020

Я запускаю докеризованное приложение django и запускаю тесты на селен с использованием pytest.

Кажется, что pytest использует другую базу данных для запуска тестов, чем мое приложение для разработки. Это означает, что я не могу использовать приборы (потому что приборы созданы в другом БД).

Я запутался в трех уровнях:

Во-первых, я вижу много учебных пособий, использующих приборы с селеном и pytest. Таким образом, это означает, что селен использует базу тестов.

Во-вторых, согласно этому ответу pytest должен использовать ту же базу тестов, что и мое приложение develompent (Django тесты с селеном без загрузки приборов )

В-третьих, согласно django документам https://docs.djangoproject.com/en/3.0/topics/testing/overview/ тестовый дБ создается перед каждым тестовым запуском, а затем уничтожается.

Это доставляет мне следующие неприятности: я выполняю свои тесты на селен также в конвейере CI. Поэтому я должен иметь возможность создавать приборы или экземпляры в БД во время выполнения. Я читал, что селен не должен использоваться для модельных испытаний. Хорошо, но почти все мои представления защищены, поэтому мне нужно войти в систему, поэтому мне нужен пользователь, поэтому мне нужна модель.

Таким образом, мой вопрос: как я могу запустить pytest с селеном, используя ту же базу данных, так что поддерживаются приборы, которые также переносимы в автоматический c конвейер?

Я предоставляю код быть более понятным (создание пользователя здесь было для тестирования, если мой прибор действительно работает):

Мой тест:

    @pytest.mark.usefixtures("setup")
    def test_login(self):
        User = get_user_model()
        User.objects.create_superuser(username='admin',
                                      password='mylongpassword',
                                      )

        print(User.objects.count())

        browser.get('http://django:8000/admin')
        username_input = browser.find_element_by_name('username')
        pass_input = browser.find_element_by_name('password')
        username_input.send_keys('admin')
        pass_input.send_keys('mylongpassword')

        browser.find_element_by_xpath('//input[@value="Log in"]').click()
        assert browser.current_url == 'http://django:8000/admin/'

Моя настройка

    @pytest.fixture
    def setup(self):
        User = get_user_model()

        User.objects.create_superuser(username='admin2',
                                      password='mylongpassword2')
        global browser
        browser = webdriver.Remote(
         command_executor='http://selenium:4444/wd/hub',
         desired_capabilities=DesiredCapabilities.CHROME,
        )
        yield
        browser.quit()

И сверху из этого, если я использую следующий прибор и передам его в свои тесты, я все еще не могу аутентифицировать , даже если мой пользователь создан, и я подключаюсь к той же базе данных, что и мое работающее приложение (распечатывая его в терминал выдает мне тот же пользовательский вывод, что и в режиме оболочки в моем приложении):

    @pytest.fixture()
    def django_db_setup(self):
        settings.DATABASES['default'] = {
            'HOST': 'postgres',
            'NAME': 'mywebsite',  # my dedicated test database (!)
            'PORT': '5432',
            'USER':  'username',
            'PASSWORD': 'pass',
        }


1 Ответ

1 голос
/ 25 февраля 2020

Вам не нужно делать приспособление для базы данных для вашего теста, Pytest сделает это за вас.

Вам просто нужно использовать приспособление для базы данных Pytest

Pytest не поддерживает вас для запуска тест на производственной / основной БД, если вы используете pytest- django. Существует более эффективный подход к решению этой проблемы.

  • Метод решения Pytest DB

  • Это говорит о том, что при каждом запуске тест с маркером @pytest.mark.django_db, тесты запускаются на другой вновь созданной базе данных с именем test_your production_db_name.

  • Так что если ваше имя базы данных равно hello, pytest создаст новую базу данных с именем test_hello и запускает на нем тесты
...