Получение ошибки «Не удается удалить локальный объект ‘LiveServerTestCase'» при попытке использовать LiveServerTestCase для тестирования приложения Flask

#python #selenium #flask #pytest #flask-testing

#python #selenium #flask #pytest #flask-тестирование

Вопрос:

Я получаю ошибку, указанную в названии, при попытке запустить unittest в моем приложении Flask с использованием LiveServerTestCase из flask_testing.

Это мой тестовый файл:

 from app import create_app
from flask_testing import LiveServerTestCase

class TestBase(LiveServerTestCase):

    def create_app(self):
        app = create_app()
        app.config.update(LIVESERVER_PORT=8847, TESTING=True)
        return app
    
    def test_app(self):
        self.assertEqual('test', 'test')
  

И это ошибка, которую я получаю после запуска моего теста с использованием nose2:

 AttributeError: Can't pickle local object 'LiveServerTestCase._spawn_live_server.<locals>.worker'

During handling of the above exception, another exception occurred:

AttributeError: 'NoneType' object has no attribute 'terminate'
Internal Error: runTests aborted: 'NoneType' object has no attribute 'terminate'
  

Я действительно не смог найти ничего полезного в Интернете по этой проблеме,

Ответ №1:

Я также столкнулся с этой проблемой и хотел опубликовать, чтобы другим было с чего начать, и им не нужно было искать так глубоко, как мне—

Я нашел здесь частичный ответ, который помог мне хотя бы понять, что происходит: https://github.com/pytest-dev/pytest-flask/issues/104

по-видимому, в OSX вам нужно запустить следующий код, чтобы переключить многопроцессорный стиль на fork вместо spawn, который является новым значением по умолчанию и несовместим с pickle:

 multiprocessing.set_start_method("fork")
  

Я разрабатываю на Windows, поэтому, насколько я могу судить, мне немного не повезло,
но у меня есть другой тестовый сервер, на котором работает CentOS, поэтому для проверки концепции я попытался запустить тесты там, и это сработало без проблем!

наконец: в другой теме вопроса я обнаружил следующее, что может помочь, и пользователи Windows могут найти обходной путь: https://github.com/pytest-dev/pytest-flask/issues/54

Комментарии:

1. Сработало для меня, хотя мне пришлось добавить аргумент «force = True» в конце, чтобы избежать ошибки «RuntimeError: контекст уже установлен», то есть: multiprocessing.set_start_method («fork», force = True)

Ответ №2:

Не могу определить, что может быть причиной. Но, извините, что спрашиваю, вы проверили версию flask, которую используете, и ее текущую совместимость с вашей версией python.

Комментарии:

1. Спасибо. Я думал, что это может быть из-за проблем с совместимостью, но в документации Flask говорится: «Мы рекомендуем использовать последнюю версию Python 3. Flask поддерживает Python 3.5 и новее, Python 2.7 и PyPy «. Кроме того, я пробовал версии 3.6 и 3.7 и получил ту же проблему..