Python unittest: как повторно использовать функции TestCase.assert

1

Я пишу подкласс unittest.TestCase для абстрагирования некоторых деталей нашего кода, и я хочу использовать свои собственные функции assert, но мне нужен этот результат утверждения, который будет передан в результат теста. Я пытаюсь повторно использовать функции unittest assert следующим образом:

class MyTestCase(unittest.TestCase):
    def assertState(state, value):
        if state_dict[state] == value:
            self.assertTrue(True)
        else:
            self.assertTrue(False)

Проблема в том, что вызов asserrState в моем экземпляре MyTestCase будет сообщать assertError вместо сообщения об ошибке объекта результата теста.

Пожалуйста, предложите, как я могу написать свои собственные функции assert в подклассе unittest.TestCase.

EDIT: То, что я хочу сделать, - это предоставить нашему классу MyTestCase базовый класс, который включает в себя больше функций assert с бизнес-логикой. Таким образом, настоящие тесты могут просто подклассифицировать MyTestCase и использовать эти утверждения без повторения одного и того же кода. Это означает, что я хочу иметь возможность вызывать MyTestCase.assertState в подклассе MyTestCase и до сих пор сообщать об ошибке тестирования для конкретного результата теста. Что-то вроде следующего.

class ConcreteTestCase(MyTestCase):
    def test_1(self):
        #do something here
        self.assertState("state", "on")

Пожалуйста, дайте мне знать, если есть способ сделать это.

  • 1
    Загляните в исходный файл для unittest, он может иметь некоторые подсказки.
  • 0
    Я думаю, что я не изложил свой вопрос яснее. В основном я пытаюсь использовать шаблон декоратора, который MyTestCase будет производным от класса unittest.TestCase, но предоставит больше функций assert, таких как assertState. Конкретные тесты будут конкретным тестовым сценарием, который будет иметь подкласс MyTestCase. Это позволит нам добавить больше методов assert, включая нашу собственную бизнес-логику.
Теги:

3 ответа

2
class MyTestCase(unittest.TestCase):
  def assertState(self, state, value):
    self.assertEqual(value, self.state_dict[state])

  def test_whatever(self):
    self.assertState(1, 1)
    self.assertState(2, 2)
1

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

Вам просто нужно добавить __unittest = True в модуль, где определяется класс.

import unittest

__unittest = True

class MyTestCase(unittest.TestCase):
    def assertState(state, value):
        if state_dict[state] != value:
            standardMsg = 'the state %s does not match %s' % (state, value)
            self.fail(self._formatMessage(msg, standardMsg))

Теперь ваш пользовательский метод assert будет вести себя точно так же, как и unittest.TestCase, и не будет показывать нежелательную трассировку стека при ошибке.

Работает на Python 2.7

Источник: http://www.gossamer-threads.com/lists/python/python/1014779

1

Прежде всего, вы забыли параметр self. Во-вторых, как вы его используете? Если вы действительно хотите объект результата теста, вот как вы это делаете:

In [1]: import unittest

In [2]: state_dict = {1:2}

In [3]: class MyTestCase(unittest.TestCase):
   ...:         def assertState(self, state, value):
   ...:             if state_dict[state] == value:
   ...:                 self.assertTrue(True)
   ...:         else:
   ...:                 self.assertTrue(False)
   ...:     def runTest(self):
   ...:         self.assertState(1,2)
   ...:         self.assertState(1,1)
   ...: 

In [4]: r = unittest.TestResult()

In [5]: MyTestCase().run(r)

In [6]: r
Out[6]: <unittest.TestResult run=1 errors=0 failures=1>

In [7]: r.errors
Out[7]: []

In [8]: r.failures
Out[8]: 
[(<__main__.MyTestCase testMethod=runTest>,
  'Traceback (most recent call last):\n  File "<ipython console>", line 9, in runTest\n  File "<ipython console>", line 6, in assertState\nAssertionError\n')]
  • 0
    Привет letitbee, это близко к тому, что я хочу, но я думаю, что я не сформулировал оригинальный вопрос лучше. То, что я хочу сделать, это создать подкласс unittest.TestCase как наш собственный базовый класс TestCase, чтобы тестировщик мог писать конкретные тесты, создав подкласс MyTestCase, который предоставит больше функций assert, поэтому подкласс MyTestCase может использовать новые методы assert. Это как шаблон декоратора. Есть ли хороший способ сделать это?
  • 0
    В чем проблема? Я просто скомбинировал MyTestCase с реальным контрольным примером, чтобы сохранить некоторую типизацию, и ничто не мешает вам создавать подклассы так, как вам хочется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню