Возникло желание отрефакторить чужой код, для чего нужно сделать следующее.
Тест-раннер подгружает тест-класс, в его неймспейсе находит методы с вхождением определенной подстроки в имя метода, и все найденные методы исполняет.
Это есть данность, которую я трогать не могу (бо очень дорого обойдется рефакторинг).
Но в то же время мне не нравится организация работы этих методов, когда ими (методами) в цикле тестируется функциональность аналогичных сущностей с разными именами.
Примерно так:
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()
Прошу ваших мнений, предложений, конструктивной критики.