Я пишу подкласс 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")
Пожалуйста, дайте мне знать, если есть способ сделать это.
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)
Очень поздний ответ, но, наконец, решение, когда я столкнулся с той же проблемой при определении моего собственного подкласса 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
Прежде всего, вы забыли параметр 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')]