Python unittest: доступ к декорированным атрибутам теста в setUp - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь выяснить, как оформить тестовую функцию таким образом, чтобы информация из декоратора была доступна для setUp. Код выглядит примерно так:

import unittest

class MyTest(unittest.TestCase):
    def setUp(self):
        stopService()
        eraseAllPreferences()
        setTestPreferences()
        startService()

    @setPreference("abc", 5)
    def testPreference1(self):
        pass

    @setPreference("xyz", 5)
    def testPreference2(self):
        pass

Цель состоит в том, чтобы setUp понимал, что он запускает testPreference1, и знал, что ему нужно установить предпочтение "ab c" в 5, прежде чем запускать службу ( и аналогично в отношении «xyz» и testPreference2).

Я, конечно, могу просто использовать условное выражение для имени теста (if self._testMethodName == "testPreference1"), но это не так уж и удобно, поскольку количество тестов растет ( + рефакторинг более подвержен ошибкам). Я надеюсь решить эту проблему в setUp, а не в реализации run. У меня также есть

Я использую python3 .6, хотя, если есть креативные решения, зависящие от более новых функций python, я тоже рад узнать об этом.

1 Ответ

0 голосов
/ 23 марта 2020

Декораторы работают хорошо, но нет реального "официального" способа получить базовый метод, поэтому я просто сделал то, что делает источник unittest: method = getattr(self, self._testMethodName)

import functools
import unittest

def setFoo(value):
    def inner(func):
        print(f"Changing foo for function {func}")
        func.foo = value

        @functools.wraps(func)
        def wrapper(self, *args, **kwargs):
            return func(self, *args, **kwargs)

        return wrapper
    return inner

class Foo(unittest.TestCase):
    def setUp(self):
        method = getattr(self, self._testMethodName)
        print(f"Foo = {method.foo}")

    @setFoo("abc")
    def testFoo(self):
        self.assertEqual(self.testFoo.foo, "abc")

    @setFoo("xyz")
    def testBar(self):
        self.assertEqual(self.testBar.foo, "xyz")

if __name__ == "__main__":
    unittest.main()
...