#python-3.x #pytest
#python-3.x #pytest
Вопрос:
У меня есть некоторый достаточно сложный код, который может использовать конфигурацию базы данных из переменных среды (проблема запутана Docker amp; Kubernetes, но это случайно)
Итак, у меня есть этот тест:
import os
import pytest
import re
from mock import MagicMock, patch
from nbexchange.app import NbExchange
from nbexchange.base import BaseHandler
from nbexchange.tests.utils import async_requests
from os import walk
@pytest.mark.gen_test
def test_different_db_name(app):
"""Check the main page"""
os.environ["NBEX_DB_DATABASE"] = "kiz_test.sqlite"
r = yield async_requests.get(app.url "/")
assert r.status_code == 200
assert re.search(r"NbExchange", r.text)
for root, dirs, files in walk('.'):
for f in files:
print(f"file: {f}")
assert 'kiz_test.sqlite' in files
#os.remove('./kiz_test.sqlite')
raise Exception(files)
- Основная концепция заключается в том, что я могу проверить, что установка переменной среды создает файл с ожидаемым именем (который я затем удаляю, чтобы сохранить диск чистым).
Затем я могу использовать:memory:
базу данных [в памяти] по умолчанию для тестов.
Когда я запускаю приведенный выше тест, я получаю (обрезанный для соответствия):
app = <nbexchange.app.NbExchange object at 0x7f378bea1208>
@pytest.mark.gen_test
def test_different_db_name(app):
"""Check the main page"""
os.environ["NBEX_DB_DATABASE"] = "kiz_test.sqlite"
r = yield async_requests.get(app.url "/")
assert r.status_code == 200
assert re.search(r"NbExchange", r.text)
for root, dirs, files in walk('.'):
for f in files:
print(f"file: {f}")
assert 'kiz_test.sqlite' in files
#os.remove('./kiz_test.sqlite')
#pass
> raise Exception(files)
E Exception: ['pytest-results.xml', 'setup.cfg', '.gitlab-ci.yml',
'.gitignore', 'setup.py', 'package.json', 'README.md',
'requirements.txt', 'kiz_test.sqlite']
nbexchange/tests/test_dbconfig.py:24: Exception
--------------------- Captured stdout call ----------------------
file: pytest-results.xml
file: setup.cfg
file: .gitlab-ci.yml
file: kiz.tgz
file: .gitignore
file: setup.py
file: package.json
file: README.md
file: requirements.txt
file: kiz_test.sqlite
Однако, когда я удаляю raise Exception(files)
, я получаю (опять же, урезанный для релевантности):
app = <nbexchange.app.NbExchange object at 0x7f8f60e4df28>
@pytest.mark.gen_test
def test_different_db_name(app):
"""Check the main page"""
os.environ["NBEX_DB_DATABASE"] = "kiz_test.sqlite"
r = yield async_requests.get(app.url "/")
assert r.status_code == 200
assert re.search(r"NbExchange", r.text)
for root, dirs, files in walk('.'):
for f in files:
print(f"file: {f}")
> assert 'kiz_test.sqlite' in files
E AssertionError: assert 'kiz_test.sqlite' in ['__main__.py',
'__init__.py', '__version__.py', 'app.py', 'base.py',
'alembic.ini', ...]
nbexchange/tests/test_dbconfig.py:21: AssertionError
--------------------- Captured stdout call ---------------------
file: pytest-results.xml
file: setup.cfg
file: .gitlab-ci.yml
file: kiz.tgz
file: .gitignore
file: setup.py
file: package.json
file: README.md
file: requirements.txt
file: kiz_test.sqlite
file: __main__.py
file: __init__.py
file: __version__.py
file: app.py
file: base.py
file: alembic.ini
file: orm.py
file: __init__.pyc
file: dbutil.py
Файл kiz_test.sqlite
явно присутствует в обеих версиях, и единственным изменением является raise Exception
— так почему assert foo in bar
в первый раз проходит, но во второй терпит неудачу?
(и да, я проверил — нет такой глупости, как пробелы, которая запутывает проблему)