Чтобы уменьшить код плиты котла, я пришел к идее генерировать тестовые примеры в тесте класса для всех без параметров.Как автоматически генерировать тестовые примеры для методов без параметров?
При управлении py.test, он признает только статический написанные тестовых случаев (test_a, test_b), но не динамически создаваемых тестовых случаев с помощью setattr(Tester,'test_' + name, member)
Возможно py.test уже осмотрел класс Tester для методов с 'test_ *' до вызова setUpClass? Любые подсказки, как это сделать?
import inspect
import unittest
class Testee:
def a(self):
print('a')
def b(self):
print('b')
#...
#...
def z(self):
print('z')
class Tester(unittest.TestCase):
@classmethod
def setUpClass(cls):
testee = Testee()
for name, member in inspect.getmembers(object=testee, predicate=inspect.ismethod or inspect.iscoroutine):
if len(inspect.signature(member).parameters):
print(str(inspect.signature(member).parameters))
setattr(Tester,'test_' + name, member)
if inspect.isfunction(member) or inspect.ismethod(member):
setattr(Tester,'test_' + name, member)
elif inspect.iscoroutinefunction(member):
setattr(Tester,'test_' + name, functools.partialmethod(TestInstrument.run_coro, member))
else:
print(member)
return super().setUpClass()
def test_a(self):
Tester.testee.a()
def test_b(self):
Tester.testee.b()
============================= тест сессия начинается ========= ==================== платформа win32 - Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 - c: \ программа файлы \ python35 \ python.exe CacheDir: .cache RootDir: C: \ тесты, INIFILE: собираемые 2 шт
sandbox.py::Tester::test_a ПРОШЛО sandbox.py::Tester::test_b PASSED
=================== 0 =============
EDIT: Если я переместить код в setupClass в глобальной области видимости (вне класса), затем py.test обнаруживает и запускает автоматически сгенерированных тестовых случаев.
Можете ли вы разместить сообщение, где вы создаете тестовый класс? Кроме того, используйте 'cls' вместо' Tester' в вашем setattr. –
@ Vincenzzzochi py.test делает для меня. – goldcode