twisted trial unittest получает ImportError

#python #twisted #trial

#python #twisted #пробная версия

Вопрос:

Я пытаюсь написать несколько тестов unittest с использованием trial для моего приложения twisted, я написал свой первый «пустой» пробный класс unittest, но когда я пытаюсь его запустить, я получаю ImportError для импорта моего модуля приложения.

Я подозреваю, что это связано с тем, что trial изменяет текущий рабочий каталог, и когда я пытаюсь импортировать свой модуль с классом object, который я хочу unittestировать, он терпит неудачу.

Я храню свои модули приложения в одном каталоге, который я настроил сам, его нет ни в одном каталоге из PYTHONPATH или других известных, в моем приложении модули импортируют другие модули, поскольку все они находятся в одном каталоге.

Код выглядит аналогично этому:

 from twisted.trial import unittest
from twisted.spread import pb
from twisted.internet import reactor, protocol 
from MyModule import MyTestSubject

class MyTestSubjectTest(unittest.TestCase):

    def setUp(self):
        print('nset up')


    def test_startConsoleServer(self):
        ts = MyTestSubject()
        .... # here goes the body of the test


    def tearDown(self):
        print('ntear down')
  

Итак, сообщение об ошибке выглядит следующим образом:
исключения.Ошибка импорта: нет модуля с именем MyModule

Возможно, это не стандартный способ использования trial или развертывания приложения на Python.

ОБНОВЛЕНИЕ: я только что нашел обходной путь для этого, просто добавьте каталог приложения в sys.path, чтобы часть импорта выглядела следующим образом:

 from twisted.trial import unittest
from twisted.spread import pb
from twisted.internet import reactor, protocol 
import sys, os; sys.path.append(os.path.abspath(os.path.curdir))
from MyModule import MyTestSubject
  

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

1. Какова точная ошибка импорта? Что не импортируется?

2. Извините, забыл упомянуть об этом. MyModule не найден «исключения. Ошибка импорта: нет модуля с именем MyModule «, я только что нашел обходной путь для этого, я добавляю каталог, в котором я храню свое приложение, в sys.path

Ответ №1:

Как организованы ваши модули / пакеты? Возможно, попробуйте структуру, подобную следующей, тогда вам не нужно будет выполнять какой-либо путь взлома:

 $ ls -R mypackage
mypackage:
__init__.py  __init__.pyc  mymodule.py  mymodule.pyc  test

mypackage/test:
__init__.py  __init__.pyc  test_mymodule.py  test_mymodule.pyc
  

запускайте тесты чуть выше каталога пакетов mypackage:

 $ trial mypackage
mypackage.test.test_mymodule
  MyModuleTestCase
    test_something ...                                                     [OK]

-------------------------------------------------------------------------------
Ran 1 tests in 0.002s

PASSED (successes=1)
  

внутренний файл test_mymodule.py:

 from twisted.trial import unittest

from mypackage.mymodule import MyTestSubject

class MyModuleTestCase(unittest.TestCase):
    def test_something(self):
        pass
  

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

1. Спасибо, это работает, но родительский каталог, содержащий mypackage, должен находиться на PYTHONPATH, иначе mymodule не найден.

2. для полноты картины, можете ли вы показать мне точную строку, которую вы используете для запуска своих тестов, и текущий рабочий каталог, из которого вы его запускаете?

3. Текущий рабочий каталог был просто пользовательским каталогом в Linux, там находится каталог mypackage с файлами application *.py внутри, строка для запуска моих скриптов ранее была: trial test_mymodule. py и в Windows, которые я использовал c:Python27python.exe c:Python27Scriptstrial.py test_mymodule.py