Python: использование doctests для классов - PullRequest
39 голосов
/ 25 апреля 2010

Можно ли использовать концепцию doctest Python для классов, а не только для функций?

Если да, то куда мне помещать тестовые документы - в строку документации класса или в строку документации конструктора?

Чтобы уточнить, я ищу что-то вроде:

class Test:
    """
    >>> a=Test(5)
    >>> a.multiply_by_2()
    10
    """
    def __init__(self, number):
        self._number=number

    def multiply_by_2(self):
        return self._number*2

Заранее спасибо,

Адам

Ответы [ 4 ]

59 голосов
/ 14 октября 2010

Вместо того, чтобы создавать экземпляр объекта в каждом методе, вы можете использовать аргумент extraglobs:

class Test:
    def multiply_by_2(self):
        """
        >>> t.multiply_by_2()
        10
        """
        return self._number*2

if __name__ == '__main__':
    import doctest
    doctest.testmod(extraglobs={'t': Test()})
26 голосов
/ 25 апреля 2010

Вам не хватает кода для фактического запуска doctests внизу файла:

class Test:
    <snip>

if __name__ == "__main__":
    import doctest
    doctest.testmod()

Что касается того, где поставить тесты:

  • Если он тестирует класс в целом, я бы поместил их в строку документации класса.
  • Если он тестирует конструктор, я бы поместил их в строку документации конструктора.
  • Если он тестирует метод (как, кажется, в этом случае), я бы фактически поместил его в строку документации этого метода.
7 голосов
/ 25 апреля 2010

Модуль doctest ищет все строки документации в файле и выполняет любой встроенный код в нем, так что да, можно использовать doctest для классов.

Что касается того, лучше ли помещать тестовые документы в строку документации класса или конструктор, я думаю, это зависит от того, что именно вы документируете.

Если строка документации дает общий обзор класса и того, как его использовать, то я думаю, что лучше поместить его в класс.

Если строка документации конкретно о том, как создавать экземпляры класса, то она должна идти в методе __init__.

Помните, что цель doctests - это, прежде всего, иметь самопроверяющийся пример кода в документации, поэтому IMHO аспект документации должен иметь приоритет над аспектом тестирования.

Изменить:

В приведенном выше примере нет кода для выполнения doctest - выполнение python test.py -v выполнит основной код Python, который просто определяет класс.

Вам нужно добавить это в конец файла:

if __name__ == "__main__":
    import doctest
    doctest.testmod()

В качестве альтернативы, если вы используете Python 2.6 или новее, запустите его с:

python -m doctest -v test.py
0 голосов
/ 14 мая 2018

Я думаю, что документация модуля doctest не объясняет, как с этим справиться, и лучше объяснить, что делать.

Шаблон, который я нашел для тестирования методов класса, которые не нуждаются в данных экземпляра, но могут нуждаться в доступе к данным класса, состоит в передаче объекта Class вместо экземпляра.

class Test:
    """
    >>> Test.multiply_by_3(Test,2)
    6
    """
    def __init__(self, number):
        self._number=number

    _THREE = 3
    def multiply_by_3(self, x):
        return x*self._THREE

if __name__ == "__main__":
    import doctest
    doctest.testmod()
...