Я запускаю докеризованное приложение 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',
}