Применять разные декораторы в зависимости от условия

Я использую unittest и параметризованный нос, и хочу применить различные декораторы к тесту на основе условия.

У меня есть тест, и я хочу пропустить unittest.skip тест или выполнить его @parameterized.expand(args)на основе аргументов, переданных в аргументы.

Я думаю, что мне нужен другой декоратор, который применяет надлежащий декоратор к тесту, но теперь уверен, как.

псевдокод может быть примерно таким:

@validate_data(args)
    def test(args):
    ...

где @validate_data(args) это декоратор, который применяется unittest.skip если аргументы == Нет или @parameterized.expand(args)иначе

Любые комментарии / предложения приветствуются.

1 ответ

Решение

Декоратор также может быть вызван как функция. @decorator эквивалентно decorator(func) а также @decorator(args) в decorator(args)(func), Таким образом, вы можете вернуть значение этих функций условно в вашем декораторе. Вот пример ниже:

def parameterized_or_skip(args=None):
    if args:
        return parameterized.expand(args)
    return unittest.skip(reason='No args')

...

@parameterized_or_skip(args)
def my_testcase(self, a, b):
    pass