2016-11-18 8 views
1

Ich bin in der gleichen Weise wie that py.test does zu prüfen, wie Assert Introspektion in Python durchzuführen. Zum Beispiel ...Wie man Introspektion in Python zu bestätigen

>>> 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' 

Ich sehe, dass die py.code Bibliothek has some functionality around this und ich habe auch this answer gesehen, unter Hinweis darauf, dass sys.excepthook Sie in welchem ​​Verhalten Sie wollen Ausnahmen anschließen kann, aber es ist mir nicht klar, wie man setze alles zusammen.

+0

Warum nicht 'pytest' selbst benutzen? – pylang

+0

@pylang Ich habe kein Problem mit der Wiederverwendung der Teile von py.test, die das zulassen, aber ich kann nicht einfach py.test selbst verwenden. Für die Zwecke meiner Frage sage ich, Sie sollten zB annehmen. dass ich in diesem Kontext keine Tests durchführe. –

Antwort

1

Sie können etwas tun, wenn Sie eine detaillierte Fehlermeldung

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) 

Dieser Code dieser Ausgabe geben wird zeigen wollen:

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. Hilft das ? –

+0

Nicht besonders, nein, aber trotzdem geschätzt. Diese Antwort fügt der Ausnahme weitere Informationen hinzu, aber was mich interessiert, ist der Status des Vergleichs selbst. In diesem Fall bedeutet das, dass Sie die Werte von a und b einschließen und feststellen, dass das Problem war, dass sie nicht gleich waren. (Aber eine allgemeine Methode, die auch mit anderen Betreibern wert sein kann) –

1

Die unittest assert gibt zusätzliche Informationen (möglicherweise mehr als du brauchst). Inspiriert von Raymond Hettinger talk. Dies ist eine Teilantwort, die nur die Werte für a und b (letzte Zeile des Ausgangs) angibt, nicht die zusätzliche Introspektion, die Sie auch suchen, die in pytest eindeutig ist.

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) 

Ausgabe

--------------------------------------------------------------------------- 
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

Danke, tho in diesem Fall bin ich speziell daran interessiert, die'Asssert'-Anweisung selbst zu introspecting. –

Verwandte Themen