#python #oop #class
#python #ооп #класс
Вопрос:
У меня есть такая структура каталогов. В корневом каталоге моего проекта у меня есть основной файл python, который говорит main.py . Также в корневом каталоге this есть папка с именем Tests . В этой тестовой папке будет серия тестовых файлов (известных только во время выполнения), например test1.py ,test2.py и т.д… В моих тестовых файлах, например Test1.py У меня есть такая структура:
from TestBase import TestBase
class Test1(TestBase):
def TestFunction(self):
# do_some_stuff
В моем main.py Я хочу вызвать эту функцию testFunction(). Как мне это сделать?
# use sys.path.append() to add Tests directory our path
x= import(testfilename)
result = x.TestFunction() # something like this method from class in testfilename
Комментарии:
1. Неясно, что означает ваш код. В чем актуальность
class Test1
? ЕстьTestFunction()
ли метод в этом классе?self
В конце концов, у него есть параметр, но нет отступа. Но опять же, вы вызываетеx.TestFunction()
второй фрагмент кода, как еслиTestFunction()
бы это была функция уровня модуля. Любые разъяснения были бы хороши.2. @Sven Я улучшил форматирование и добавил информацию, в каждом тестовом файле есть класс, названный в честь имени файла. Например test1.py имеет класс с именем Test1, test2.py имеет Test2 и т.д.. testFunction — это метод класса Test1
Ответ №1:
Начиная с Python 2.7, необходимая функциональность включена во встроенный unittest
модуль. Для более ранних версий Python этот модуль был перенесен обратно под именем unittest2
.
Если по какой-то причине вы хотите выполнить собственное тестовое обнаружение, вот базовый подход:
import glob
import sys
import TestBase
sys.path.append("tests")
for path in glob.iglob("tests/*.py"):
module = __import__(os.path.basename(path)[:-3])
for name in dir(module):
obj = getattr(module, name)
if isinstance(obj, type) and issubclass(obj, TestBase.TestBase):
test = obj()
test.TestFunction()
Комментарии:
1. Можете ли вы объяснить, что это делает: если isinstance(obj, type) и issubclass(obj, TestBase . TestBase): test = obj()
2. Это проверяет, является ли
obj
это подклассомTestBase
, и если это так, создает экземпляр этого класса.3. Просто чтобы подтвердить, правильно ли я понимаю, isinstance(obj,type) проверяет, имеет ли obj тип ‘class’ . В нашем примере будет проверяться, относится ли Test1 к типу class и является ли производным от TestBase
4. @johnnyalpaca: Ваше понимание верно. Первая часть проверки (
isinstance(obj, type)
) предназначена только для того, чтобы вторая часть (issubclass(obj, TestBase.TestBase)
) не выдавала исключение, что и произошло бы, еслиobj
бы вообще не было типом.
Ответ №2:
я не уверен, как вы хотите добавлять тестовые файлы во время выполнения.. я бы попробовал это,
try:
import Test.test1 as t1
test= True;
except ImportError:
test = False ;
Вы можете использовать системный вызов, чтобы найти тестовый файл, доступный во время выполнения. Затем попробуйте импортировать их с помощью цикла for, как показано выше.
Ответ №3:
я думаю, вам нужно сделать что-то подобное, если testfilename находится в /test/ dir
m = __import__('test.testfilename')
t = m.Test1()
x = t.TestFunction()
дайте мне знать, если это сработает