2016-11-18 5 views
1

Я изучаю, как выполнять интроспекцию assert в Python, точно так же that py.test does. Например ...Как выполнить интроспекцию assert в Python

>>> a = 1 
>>> b = 2 
>>> assert a == b 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AssertionError # <--- I want more information here, eg 'AssertionError: 1 != 2' 

Я вижу, что py.code библиотеки has some functionality around this и я также видел this answer, отметив, что sys.excepthook позволяет подключить любое поведение, которое вы хотите исключение, но это мне не ясно, как положил все это вместе.

+0

Почему бы не использовать 'pytest' себя? – pylang

+0

@pylang У меня нет проблем с повторным использованием частей py.test, которые позволяют это произойти, но я не могу просто использовать сам py.test. Для целей моего вопроса я говорю, что вы должны предполагать, например. что в этом контексте я не выполняю тесты. –

ответ

1

Вы можете сделать что-то вроде этого, если вы хотите, чтобы показать подробное сообщение об ошибке

def assertion(a,b): 
    try: 
     assert a==b 
    except AssertionError as e: 
     e.args += ('some other', 'information',) 
     raise 

a=1 
b=2 
assertion(a,b) 

Этот код даст этот вывод:

Traceback (most recent call last): 
    File "tp.py", line 11, in <module> 
    assertion(a,b) 
    File "tp.py", line 4, in assertion 
    assert a==b 
AssertionError: ('some other', 'information') 
+1

@Tom. Помогает ли это? –

+0

Не особенно, нет, но в любом случае оценили. Этот ответ добавляет в другую дополнительную информацию к исключению, но меня интересует состояние самого сравнения. В этом случае это означает включение значений a и b и определение того, что проблема заключается в том, что они не равны. (Но метод общего назначения, который может также стоить с другими операторами) –

1

unittest утверждают, дает дополнительную информацию (возможно, более тебе нужно). Вдохновленный Рейндом Хеттингером talk. Это частичный ответ, дающий только значения a и b (последняя строка вывода), а не дополнительная интроспекция, которую вы также ищете, которая уникальна в pytest.

import unittest 

class EqualTest(unittest.TestCase): 

    def testEqual(self, a, b): 
     self.assertEqual(a, b) 


a, b = 1, 2 
assert_ = EqualTest().testEqual 
assert_(a, b) 

Выход

--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-4-851ce0f1f668> in <module>() 
     9 a, b = 1, 2 
    10 assert_ = EqualTest().testEqual 
---> 11 assert_(a, b) 

<ipython-input-4-851ce0f1f668> in testEqual(self, a, b) 
     4 
     5  def testEqual(self, a, b): 
----> 6   self.assertEqual(a, b) 
     7 
     8 

C:\Anaconda3\lib\unittest\case.py in assertEqual(self, first, second, msg) 
    818   """ 
    819   assertion_func = self._getAssertEqualityFunc(first, second) 
--> 820   assertion_func(first, second, msg=msg) 
    821 
    822  def assertNotEqual(self, first, second, msg=None): 

C:\Anaconda3\lib\unittest\case.py in _baseAssertEqual(self, first, second, msg) 
    811    standardMsg = '%s != %s' % _common_shorten_repr(first, second) 
    812    msg = self._formatMessage(msg, standardMsg) 
--> 813    raise self.failureException(msg) 
    814 
    815  def assertEqual(self, first, second, msg=None): 

AssertionError: 1 != 2 
+0

Спасибо, в этом случае мне интересна только интроспекция самой инструкции 'assert'. –