Django 1.11: Что не удается `pickle` в моем параллельном тестовом прогоне?

Я использую dockerized Django 1.11 и хочу запустить свой многолетний набор тестов параллельно сейчас:

manage.py test mainfolder --parallel -v2

Хотя он не проходит через 2 минуты в моем тестовом наборе (после того, как все тесты до сих пор прошли успешно) с ошибкой рассола. Однако трассировка стека не дает мне указания, где это происходит. Как я могу приблизиться к тому, что терпит неудачу? tblib установлен.

test_foo (myapp.some.testmodule.SomeTestCase) ... ok
Traceback (most recent call last):
  File "./myapp/manage.py", line 34, in <module>
    execute_from_command_line()
  File "/var/venv-stable/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/var/venv-stable/lib/python2.7/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/var/venv-stable/lib/python2.7/site-packages/django/core/management/commands/test.py", line 29, in run_from_argv
    super(Command, self).run_from_argv(argv)
  File "/var/venv-stable/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/var/venv-stable/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/var/venv-stable/lib/python2.7/site-packages/django/core/management/commands/test.py", line 62, in handle
    failures = test_runner.run_tests(test_labels)
  File "/var/venv-stable/lib/python2.7/site-packages/django/test/runner.py", line 603, in run_tests
    result = self.run_suite(suite)
  File "/var/venv-stable/lib/python2.7/site-packages/django/test/runner.py", line 567, in run_suite
    return runner.run(suite)
  File "/usr/lib/python2.7/unittest/runner.py", line 151, in run
    test(result)
  File "/usr/lib/python2.7/unittest/suite.py", line 70, in __call__
    return self.run(*args, **kwds)
  File "/var/venv-stable/lib/python2.7/site-packages/django/test/runner.py", line 370, in run
    subsuite_index, events = test_results.next(timeout=0.1)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 659, in next
    raise value
cPickle.PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed

Может быть, один из ваших тестов возвращает модуль (или, если возможно, вызывает ошибку модуля?)?

Håken Lid 02.05.2018 12:17

Думаю примерно так: import foo; raise foo. Это все испортит. Средство выполнения многопроцессных тестов также будет иметь проблемы с обработкой исключений, которые создаются во время выполнения, например MyModel.DoesNotExist, но в этом случае вы должны получить другое сообщение об ошибке.

Håken Lid 02.05.2018 12:23

Я не знаю, можно ли в этом случае получить дополнительную информацию в трассировке. В противном случае вы можете выяснить, какой тест вызывает эту ошибку, путем отладки по принципу «разделяй и властвуй».

Håken Lid 02.05.2018 12:29

С помощью «разделяй и властвуй» я мог постепенно идентифицировать виновника, и это был действительно странный, старый, сломанный, устаревший код. В тестовом примере __init__ была переменная класса, указывающая на модуль Python без каких-либо веских причин. Набор тестов сейчас запущен, посмотрим, был ли он единственным.

djangonaut 03.05.2018 22:48

Вы должны представить свое решение в качестве ответа и принять его. Вероятно, это редкая ошибка, но она может кому-то помочь в будущем.

Håken Lid 04.05.2018 16:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
924
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

from django.core import mail

def __init__(self, *args, **kwargs):
    super(EmailTestHelperMixin, self).__init__(*args, **kwargs)
    self.mail = mail

Удаление этого устранило мою проблему.

Другие вопросы по теме