Сейчас я работаю над проектом, в котором мне нужно запускать тесты внутри другой файловой структуры, например:
/my_project
├── __init__.py
├── ...my python code
/given_proj
├── __init__.py
├── /package
│ ├── __init__.py
│ └── main.py
└── /tests
└── test_main.py
Текущий подход
Изнутри моего проекта я хочу выполнить тесты в рамках данного проекта.
Мой текущий подход использует unittest. TextTestRunner вот так:
unittest.TextTestRunner().run(unittest.defaultTestLoader.discover('../given_proj/tests')).
Проблема с текущим подходом
Конечно, тестовый файл хочет импортировать из main.py вот так из package.main импортируйте my_function. Однако когда я запускаю свой код, тесты не запускаются, поскольку не удается найти модуль «пакет»:
...\given_proj\tests\test_main.py", line 2, in
from package.main import my_function
ModuleNotFoundError: No module named 'package'
Когда я запускаю тесты с помощью python -m unittest Discover -s тесты из командной строки в каталоге заданного_проекта, они работают нормально.
Что я пробовал
Я пытался изменить рабочий каталог на заданный_proj с помощью os.chdir('../given_proj') однако результат тот же.
Я попробовал импортировать модуль вручную с помощью importlib.import_module(). Вот я и не уверен, сделал ли я это неправильно или это тоже не работает.
Мой вопрос
Как мне сделать, чтобы тесты прошли run, как если бы я запускал его из того каталога, в котором они должны запускаться? В идеале мне вообще не нужно менять «given_project», потому что я хочу сделать это с несколькими проектами.
Воспроизведение
Я свел его к очень минимальному проекту, если кто-то захочет попытаться воспроизвести его. Файловая структура указана в верхней части сообщения.
Все файлы __init__.py пусты.
/my_project/main.py:
import os
import unittest
import os
import unittest
if __name__ == "__main__":
dirname = "../given_proj/tests" #either "./" or "../" depending of where you run the python file from
unittest.TextTestRunner().run(unittest.defaultTestLoader.discover(dirname))
/given_proj/package/main.py:
def my_function(num):
return num*2
/given_proj/tests/test_main.py:
import unittest
from package.main import my_function
class TestMain(unittest.TestCase):
def test_my_function(self):
result = my_function(5)
self.assertEqual(result, 10)
result = my_function(10)
self.assertEqual(result, 20)
result = my_function(0)
self.assertEqual(result, 0)
if __name__ == '__main__':
unittest.main()
Подробнее здесь: https://stackoverflow.com/questions/786 ... ferent-pro