私は、assertが呼び出されるたびに、ファイル/データベースに何らかの情報を記録したいと思います。 assertが呼び出されるたびにassertをオーバーライドしたり、コールバック関数を登録する方法はありますか?pytest(python)のデフォルトのアサートをオーバーライドする方法はありますか?
よろしく シャラド
私は、assertが呼び出されるたびに、ファイル/データベースに何らかの情報を記録したいと思います。 assertが呼び出されるたびにassertをオーバーライドしたり、コールバック関数を登録する方法はありますか?pytest(python)のデフォルトのアサートをオーバーライドする方法はありますか?
よろしく シャラド
私はそれが可能だろうとは思いません。 assert
は、Pythonの文(関数ではない)であり、あらかじめ定義された動作をしています。これは言語要素であり、変更することはできません。言語を変更しても問題の解決にはなりません。言語によって提供されるものを使用して問題を解決する必要があります。
あなたができることは1つあります。アサートでは、失敗時には例外AssertionError
が発生します。これは、仕事を完了させるために悪用される可能性があります。 assert statement
をブロックTry-expect
に配置し、そのブロック内にコールバックを実行します。それはあなたが探しているほど良い解決策ではありません。すべての主張でこれを行う必要があります。ステートメントの動作を変更することは、実行しないことです。
assert
の代わりにAssertionError
をオーバーロードしてみてください。元のアサーションエラーはpython2ではexceptions module、python3ではbuiltinsモジュールで利用可能です。
import exceptions
class AssertionError:
def __init__(self, *args, **kwargs):
print("Log me!")
raise exceptions.AssertionError
pyhamcrestを使用することをお勧めします。それは単に再実装することができる非常に美しいmatcherを持っています。また、自分で書くこともできます。
pytestが実際にアサート式を書き直すことがあるため、可能です。私はそれを行う方法を知らないか、それがいかに簡単であるかが、ここではアサート再書き込みがpytestに発生したときに説明するドキュメントです: https://docs.pytest.org/en/latest/assert.html
デフォルトでは、Pythonのバージョンがより大きいかと等しい場合2.6、py.testは、テストモジュール内のアサート文を書き換えます。
...
py.testは、インポート時にテストモジュールを書き換えます。新しいpycファイルを書き込むために インポートフックを使用してこれを行います。
理論的には、pytestコードを見て、それらの動作を確認したり、おそらく同様のことを行うことができます。詳細については
は、ベンジャミン・ピーターソンはpy.testの新しい主張[http://pybites.blogspot.com/2011/07/behind-scenes-of-pytests-new-assertion.htmlで]書き換えの舞台裏まで書いた