Форум сайта python.su
Доброго времени суток, господа!
Возникло желание отрефакторить чужой код, для чего нужно сделать следующее.
Тест-раннер подгружает тест-класс, в его неймспейсе находит методы с вхождением определенной подстроки в имя метода, и все найденные методы исполняет.
Это есть данность, которую я трогать не могу (бо очень дорого обойдется рефакторинг).
Но в то же время мне не нравится организация работы этих методов, когда ими (методами) в цикле тестируется функциональность аналогичных сущностей с разными именами.
Примерно так:
class MyClass(TestClass):
def testFn(self, x):
seq1 = ['aaa', 'bbb', 'ccc', 'ddd', 'fff']
for s in seq1:
print x
class MyClass():
seq1 = ['aaa', 'bbb', 'ccc', 'ddd', 'fff']
for s in seq1:
exec "def test%s(self): self.my_fn('%s')" % (s.capitalize(), s)
def my_fn(self, x):
print x
if __name__ == "__main__":
obj = MyClass()
for k in MyClass.__dict__:
if k.find('test') == 0:
m = getattr(obj, k)
m()
Офлайн
А почему нельзя было заловить и обработать выскакивающие исключения?
Офлайн
doza_andЕсли бы можно было хэндлить исключения, я бы с этим не заморачивался.
А почему нельзя было заловить и обработать выскакивающие исключения?
Офлайн
Все хуже. Нужно посмотреть unittest:TestCase.run и сделать по подобию.
Офлайн
Андрей Светловсобственно, это оттуда и есть:
Все хуже. Нужно посмотреть unittest:TestCase.run и сделать по подобию.
m = getattr(obj, k)
m()
Офлайн
Собственно говоря зачем лепить методы, да еще и через варварский exec?
Давайте вы показываете кусочек кода, а там посмотрим.
Имеющиеся — никуда не годятся.
Мы говорим о unittest? Откуда это следует?
Если ваш MyClass — тестовый контейнер, то почему он не наследует TestCase?
Как делается “проверка правильности”? Простой print выглядит неубедительно.
Офлайн
Андрей СветловВроде же достаточно раскрыл подоплеку необходимости этого:
Собственно говоря зачем лепить методы, да еще и через варварский exec?
Давайте вы показываете кусочек кода, а там посмотрим.
Имеющиеся — никуда не годятся.
Мы говорим о unittest? Откуда это следует?
Если ваш MyClass — тестовый контейнер, то почему он не наследует TestCase?
Как делается “проверка правильности”? Простой print выглядит неубедительно.
Отредактировано (Апрель 25, 2011 22:23:37)
Офлайн
Есть сферический конь с педальным приводом. Детали реализации не важны.
Как его улучшить?
Коня — не покажу, даже на полвзгляда. И не просите!
Вроде бы я достаточно раскрыл делали и прочие функциональные особенности?
Еще раз повторяю, если кто чего не понял.
Есть конь. Сферический. Всем хорош, но олени быстро устают. Приделал педали. Можно ли улучшить конструкцию?
Офлайн
Андрей, я ценю Ваше чувство юмора.
Только почему бы нам на абстрагироваться от unittest'а, и не рассмотреть вопрос, как он поставлен.
Вот Вы упомянули “варварский exec”, видимо имея в виду наличие более тонкого/правильного подхода к реализации сабжа?
Был бы признателен, если бы поделились идеями.
Офлайн
Привет от наших психов — вашим. И так вроде бы абстрагировались до полной сферичности.
Тем не менее — держите:
>>> class A(object):
... pass
...
... for name in 'abc':
... setattr(A, name, lambda self, name=name: name)
...
... a = A()
... print a.a()
... print a.b()
... print a.c()
a
b
c
>>>
Офлайн