2015-10-10 2 views
1

У меня есть структура каталогов следующим образом:Где разместить питон UnitTests

DirA 
    __init__.py 
    MyClass.py 
    unittests <------------------directory 
     MyClassTest.py 

MyClassTest.py выполним:

import unittest 
from . import MyClass  

class MyClassTestCase(unittest.TestCase): 
    """ Testcase """ 

... 
..... 

if __name__ == '__main__': 
    unittest.main() 

Я получаю сообщение об ошибке «модуль Родителя„“не загружено, не может выполнить относительный импорт»в строке:

from . import MyClass 

Я хотел бы разместить UnitTests в каталоге„UnitTests“рядом с Modul проверяются. Есть ли способ сделать это и иметь доступ ко всем модулям в родительском каталоге, который я тестирую?

+0

Я предпочитаю поставить модульные тесты вне пакета иерархии, в отдельном подкаталоге в корне проекта. Таким образом, они не включаются в встроенные дистрибутивы. – Keith

+0

Конечно, я тоже могу это сделать. Это в основном, как я сделал бы это на C++, чтобы его переносить с этого :) –

ответ

2

Вы пробовали запустить тесты, как так:

cd DirA 
python -m unittest discover unittests "*Test.py" 

Это должно правильно найти ваши модули. См Test Discovery

+0

Просто попробовал. Он не смог найти тест. Пробовал это как от DirA, так и от DirA/unittests. Если я непосредственно запускаю его как python MyClassTest.py, я получаю тот же «родительский модуль», который не загружен, не может выполнять относительный импорт. –

+0

Извините, я отредактировал свой ответ, но я думаю, что это было правильно, прежде чем 'python -m unittest обнаружит unittests', что работа для вас? И затем в своем тесте вы сможете просто сказать 'import MyClass' – jayant

+0

Ну, он больше не выдает ошибку. Но он говорит, что 0 тестов прошло. –

0

Предлагаемая структура, будет смотреть на вашу структуру, как это:

my_app 
    my_pkg 
     __init__.py 
     module_foo.py 
    test 
     __init__.py 
     test_module_foo.py 
    main.py 

Выполнить все изнутри my_app, таким образом, вы будете использовать все те же ссылки модуля между вашим тестового кода и кода ядра ,

1

Используйте любой макет вы хотите, в зависимости от ваших собственных предпочтений и так, как вы хотите, чтобы ваш модуль для импорта:

Чтобы найти папку unittests, так как имя не является обычным (отдельные тестовые сценарии по умолчанию ищут папку test), вы можете использовать опцию discover модуля unittest для передачи LL как найти тестовые скрипты:

python -m unittest discover unittests 

Обратите внимание, что первая unittest является модуль Python, а второй unittestss) Ваш каталог, в котором вы разместили свои сценарии тестирования.

Другой альтернативой является использование модуля nosetest (или других новых модулей модульного тестирования, как pytest или tox), который должен автоматически найти сценарий тестирования, где бы вы поместите их:

nosetests -vv 

И исправить ошибки импорта , вы должны использовать полный относительный (или абсолютный) путь:

from ..MyClass import MyClass # Relative path from the unittests folder 
from MyClass import MyClass # Absolute path from the root folder, which will only work for some unit test modules or if you configure your unit test module to run the tests from the root 
+0

Спасибо. Я перешел в каталог DirA и запускал «python -m unittest find unittests». Я изменил оператор импорта как «из MyClass import MyClass». Это не вызывает ошибок. Но и тестов не найти. Я получаю 0 тестов. Теперь я создал имя файла и имя класса: MyClassTestCase.py & MyClassTestCase –

0

относительный импорт Python не работает (или я должен сказать, что они работают по-разному), когда работает модуль самостоятельно. I.e., когда __name__ == "__main__", поэтому у вас есть ошибка не может выполнить относительный импорт.

Вы можете посмотреть на PEP https://www.python.org/dev/peps/pep-0328/

Я использую довольно уродливую затруднительное, но не нашел гораздо лучше до сих пор, что для проверки во время импорта, является ли модуль работать «в одиночку» или если он был импортирован из другого кода python.

С моими исправить ваш код MyClassTest.py станет

import unittest 
if(__name__ == "__main__"): 
    import sys 
    sys.path.add(1,'path/to/yourClass') 
    import MyClass 
else: 
    from . import MyClass  

class MyClassTestCase(unittest.TestCase): 
    """ Testcase """ 

... 
..... 

if __name__ == '__main__': 
    unittest.main() 

Но это не очень затруднительным, как вам нужно использовать абсолютный путь к модулю, который требуется импортировать. Если у кого есть более гибкий способ исправить это, мне было бы очень интересно!

Надеется, что это помогает

Смежные вопросы