Как записать имя класса теста, если метод теста находится в классе, общем для всех тестов? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть следующая структура проекта:

/root
  /tests
    common_test_case.py
    test_case_1.py
    test_case_2.py
    ...
  project_file.py
  ...

Каждый тест test_case_... наследуется от unittest.TestCase и common_test_case.CommonTestCase.Класс CommonTestCase содержит методы испытаний, которые должны выполняться всеми тестами (хотя используются данные, уникальные для каждого теста, которые хранятся и доступны в self.something теста).Если для конкретного теста требуются некоторые конкретные тесты, они добавляются непосредственно в этот конкретный класс.

В настоящее время я работаю над добавлением регистрации в мои тесты.Помимо прочего, я хотел бы записать в журнал класс, из которого был запущен метод (поскольку вышеупомянутый подход подразумевает одно и то же имя метода тестирования для разных классов).Я хотел бы использовать встроенный модуль logging для достижения этой цели.

Я пробовал следующие атрибуты LogRecord : %(filename)s, %(module)s,%(pathname)s.Тем не менее, для методов, определенных в common_test_case.py, все они возвращают путь / имя к common_test_case.py, а не к тестовому модулю, из которого они фактически выполнялись.

Мои вопросы:

  1. Есть ли способ достичь того, что я пытаюсь сделать, используя только встроенный logging модуль?
  2. Используя какой-то сторонний / другой модуль (я думал, может быть, какое-то "хакерское" решение с inspect)?
  3. Можно ли вообще достичь (в Python)?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Ваш вопрос похож на этот один и решается путем:

self.id()

См. Определение функции здесь , которое вызывает self.__class__ для экземпляра класса TestCase, который создается. Учитывая, что вы используете множественное наследование, применяются правила множественного наследования от Python :

В большинстве случаев в простейших случаях вы можете думать о поиске атрибутов, унаследованных от родительского класса, как о первой глубине, слева направо, а не о поиске дважды в одном и том же классе, где есть перекрытие в иерархия.

Что означает, что common_test_case.CommonTestCase будет найден тогда unittest.TestCase. Если в common_test_case.CommonTestCase нет функции id, все должно работать так, как если бы она была получена только из unittest.TestCase. Если вы чувствуете необходимость добавить id функцию к CommonTestCase, что-то вроде этого (если действительно необходимо):

def id(self):
  if issubclass(self,unittest.TestCase):
    return super(unittest.TestCase,self).id()
0 голосов
/ 12 апреля 2019

Решение Я нашел (это пока что помогает):

import inspect

class_called_from = inspect.stack()[1][0].f_locals['self'].__class__.__name__

Мне все еще интересно, есть ли более «ясный» метод или это возможно сделать с помощью модуля logging .


Рецепты, основанные на Ответ Запада (проверено на Python 3.6.1):

test_name = self.id().split('.')[-1]
class_called_from = self.id().split('.')[-2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...