Показывать строки документации при каждом вызове функции

#python-3.x #python-unittest #docstring

#python-3.x #python-unittest #строка документации

Вопрос:

Допустим, у меня есть такой код:

  class NewTestCase(unittest.TestCase, CommonMethods):

   def setUp(self):
      self.shortDescription()

   def test_01_sample test(self):
      """Testing something"""
      self.create_account(self.arg['account'])
      assert ...
   ...


 class CommonMethods():

   def create_account(self, account):
      """Creating account"""
      ...

 if __name__ == '__main__':
    unittest.main(verbosity=2, warnings='ignore')
  

Я хочу показать строки документации всех методов, определенных / созданных мной («Тестирование чего-либо» и «Создание учетной записи»), но выполнение показывает только «Тестирование чего-либо». Есть совет?

Комментарии:

1. Предполагая, что create_account используется что-то вроде len , str , print и т.д. Должны ли также отображаться их строки документации?

2. Нет. Только методы, определенные / созданные мной.

3. Думаю, вы могли бы написать какой-нибудь декоратор, который изменяет все методы экземпляра для печати их строки документации…

4. Я думал, что смогу решить это, используя что-то более простое, но хорошо, ваше решение может быть подходящим.

Ответ №1:

Возможно, в unittest модуле есть опция для этого, но я сомневаюсь в этом; в противном случае, как бы этот модуль различал ваши методы и функции и всевозможные библиотечные функции?

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

Это должно «вербализовать» все методы данного класса (только слегка протестировано!), И вы могли бы создавать аналогичные для отдельных функций или целых модулей.

 def verbosify(clazz):
    for name in dir(clazz):
        attr = getattr(clazz, name)
        if not name.startswith("__") and callable(attr):
            def attr_verbose(*args, **kwargs):
                print("Calling", name, args, kwargs)
                print(attr.__doc__)
                return attr(*args, **kwargs)
            setattr(clazz, name, attr_verbose)
  

Просто вызовите verbosify(CommonMethods) в своем main блоке.