Я пишу модульные тесты для MCU, который передает команды через порт USB и проверяет их ответ. Если один модульный тест не проходит, мне имеет смысл выполнить некоторую отладку в MCU. Поэтому я хотел бы отключить все модульные тесты, кроме того, который я хотел бы отлаживать на стороне MCU, потому что, если я где-то установлю точку останова, он может быть запущен другим модульным тестом с другими командами.
Я зашел в документацию python и нашел этот код, который является декоратором, который пропускает все модульные тесты, у которых нет атрибута.
def skipUnlessHasattr(obj, attr):
if hasattr(obj, attr):
return lambda func: func
return unittest.skip("{!r} doesn't have {!r}".format(obj, attr))
Чтобы упростить задачу, я удалил аргумент attr и статически изменил его на «StepDebug», который является атрибутом, который я хочу установить только в одном модульном тесте для его отладки.
Итак, следующий шаг для меня - автоматически применить это ко всем моим методам класса. Прочитав в сети, я нашел следующий код, который использует метакласс для украшения всех методов указанным выше декоратором. https://stackoverflow.com/a/6308016/3257551
def decorating_meta(decorator):
class DecoratingMetaclass(type):
def __new__(self, class_name, bases, namespace):
for key, value in list(namespace.items()):
if callable(value):
namespace[key] = decorator(value)
return type.__new__(self, class_name, bases, namespace)
return DecoratingMetaclass
Итак, мой минимальный рабочий пример:
import unittest
def decorating_meta(decorator):
class DecoratingMetaclass(type):
def __new__(self, class_name, bases, namespace):
for key, value in list(namespace.items()):
if callable(value):
namespace[key] = decorator(value)
return type.__new__(self, class_name, bases, namespace)
return DecoratingMetaclass
def skipUnlessHasattr(obj):
if hasattr(obj, 'StepDebug'):
return lambda func : func
return unittest.skip("{!r} doesn't have {!r}".format(obj, 'StepDebug'))
class Foo(unittest.TestCase):
__metaclass__ = decorating_meta(skipUnlessHasattr)
def test_Sth(self):
self.assertTrue(False)
if __name__ == '__main__':
unittest.main()
и ошибка, которую я получаю:
AttributeError: 'Foo' object has no attribute '__name__'
Из того, что я прочитал, это происходит, когда вместо класса у вас есть экземпляр, но я не совсем понимаю, как я могу использовать эту информацию для решения моей проблемы.
Может кто-нибудь помочь?
@unittest.skipUnlessHasattr("StepDebug")
до того, как ваше объявление теста класса действительно декорирует весь метод. Кроме того, вы можете определить собственный декоратор какdef myskip(): return unittest.skipUnlessHasattr("StepDebug")
. - person Michele d'Amico   schedule 08.05.2015@unittest.skipUnlessHasattr()
тоже будет работать как декоратор классов. Я уверен, что вы можете применить@skip
docorator классу, но неясно, действительно ли это и дляskipUnlessHasattr()
. - person Michele d'Amico   schedule 08.05.2015