一般的に、私はこれをやっていないことをお勧めしたいです。あなたの生産コードは、本当に単体テストが存在することを認識すべきではありません。これの1つの理由は、あなたのif TESTING
ブロックにテストをパスする(偶然にも)コードを持つ可能性があり、コードの実動でこれらのビットが実行されないため、テストでもパス。
あなたがこれを行うと主張すれば、私は考えることができる2つの可能な方法があります。
最初に、テストケースで設定したモジュールレベルTESTING
varをTrue
にすることができます。たとえば:
量産コード:
TESTING = False # This is false until overridden in tests
def foo():
if TESTING:
print "expensive stuff..."
ユニットテストコード:
import production
def test_foo():
production.TESTING = True
production.foo() # Prints "expensive stuff..."
第二の方法は、Pythonの組み込みassert
キーワードを使用することです。 Pythonが-O
で実行されると、インタプリタはコード内のすべてのアサート文を削除(または無視)し、これらの高価な宝石を一貫して振りかけることができ、最適化モードで実行されると実行されないことを認識します。 -O
フラグを付けずにテストを実行してください。
例(量産コード):
def expensive_checks():
print "expensive stuff..."
return True
def foo():
print "normal, speedy stuff."
assert expensive_checks()
foo()
出力(python mycode.py
で実行)
normal, speedy stuff.
expensive stuff...
出力(python -O mycode.py
で実行)
normal, speedy stuff.
assert文について注意してください... assert文が真の値に評価されない場合、AssertionError
が発生します。
高価なサニティチェックコードを単体テストに直接入れることはできませんか? –
unittestがいくつかの共通コードを呼び出し、その共通コードが高価なコードパスをチェックしているためです。また、中間の値をシャッフルすると同じ出力を生成する関数がありますが、実動コードの中間値をシャッフルしたくありません。 –
実行したくないコードをモック/パッチアウトできるように、関数を再因子化する必要があります。 – agf