2016-11-18 6 views
1

同じ方法で、同じ方法でアサートイントロスペクションをPythonで実行する方法を検討しています。that py.test does。たとえば...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ことを確認し、私はまたsys.excepthookはあなたが例外に好きな振る舞いをプラグインすることができますが、どのようにそれは私にははっきりしていないことを指摘し、this answerを見てきましたすべて一緒に置く。あなたは詳細なエラーメッセージ

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) 

にこのコードを表示したい場合は、このような何かを行うことができ

+0

'pytest'自体を使用しないのはなぜ? – pylang

+0

@pylang py.testの部分を再利用することは問題ありませんが、py.test自体を使うことはできません。私の質問の目的のために、私はあなたが例えば仮定すべきだと言う。この文脈で実際にテストを実行しているわけではありません。 –

答えて

1

は、この出力を与える:

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アサートは、余分な情報を提供します(より可能性の多くをあなたが必要です)。 Raymond Hettingerのtalkに触発されています。 これは部分的な答えで、ab(出力の最後の行)の値のみを指定し、追加のイントロスペクションは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'ステートメント自体のイントロスペクションに興味があります。 –

関連する問題