Python :лучший способ протестировать один метод класса

У меня есть класс, подобный следующему:

class A:
    def __init__(self, arg1, arg2, arg3):
        self.a=arg1
        self.b=arg2
        self.c=arg3
        #...
        self.x=do_something(arg1, arg2, arg3)
        self.y=do_something(arg1, arg2, arg3)

        self.m = self.func1(self.x)
        self.n = self.func2(self.y)
        #...

    def func1(self, arg):
        # do something here

    def func2(self, arg):
        # do something here

Как видите, для инициализации класса необходимо передать arg1, arg2 и arg3. Однако тестирование функций func1 и func2 напрямую не требует таких входных данных, а скорее представляет собой просто логику ввода/вывода.

В моем тесте я, конечно, могу создать и инициализировать тестовый объект обычным способом, а затем протестировать функции func1 и func2 по отдельности. Но для инициализации требуется ввод arg1 arg2, arg3, что на самом деле не имеет отношения к проверке func1 и func2.

Поэтому я хочу протестировать func1 и func2 по отдельности, без предварительного вызова __init__. Итак, у меня есть следующие 2 вопроса:

  1. Каков наилучший способ разработки таких тестов? (желательно в py.test)
  2. Я хочу протестировать func1 и func2 без вызова __init__. Я читал из здесь , что A.__new__()может пропустить вызов __init__, но при этом создать экземпляр класса. Есть ли лучший способ добиться того, что мне нужно, не делая этого?

ПРИМЕЧАНИЕ:

Было 2 вопроса по поводу моего вопроса здесь:

  1. Нужно ли тестировать отдельные функции-члены?
  2. (для целей тестирования )Необходимо ли создавать экземпляр класса без инициализации объекта с помощью __init__?

Что касается вопроса 1, я провел быстрый поиск в Google и нашел соответствующее исследование или обсуждение по этому вопросу :

We initially test base classes having no parents by designing a test suite that tests each member function individually and also tests the interactions among member functions.

По вопросу 2 я не уверен. Но я думаю, что это необходимо, как показано в примере кода, func1 и func2 вызываются в __init__. Мне удобнее тестировать их на объекте класса A, который не вызывался с__init__(и, следовательно, никаких предыдущих вызовов func1 и func2 ).

Конечно, можно просто создать экземпляр объекта класса A с обычными средствами (testobj = A ()), а затем выполнить отдельные тесты для func1 и func2. Но хорошо ли это :)? Я просто обсуждаю здесь, как лучше протестировать такой сценарий, каковы его плюсы и минусы.

С другой стороны, можно возразить, что с точки зрения дизайна НЕ следует помещать вызовы func1 и func2 в __init__на первое место. Это разумный вариант дизайна?

8
задан Community 23 May 2017 в 12:26
поделиться