Получение разъяснений по утверждению pytest, которое проходит или завершается с ошибкой в зависимости от более позднего исключения

#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 в первый раз проходит, но во второй терпит неудачу?
(и да, я проверил — нет такой глупости, как пробелы, которая запутывает проблему)