ドキュメントによると、unittest.main
を呼び出すときにPythonユニットテストの冗長レベルを設定できます。unittest.TestCaseのunittest.main(冗長)設定にアクセスする方法
unittest.main(verbosity=2)
unittest.TestCase
でこの情報にアクセスするにはどうすればよいですか?
ドキュメントによると、unittest.main
を呼び出すときにPythonユニットテストの冗長レベルを設定できます。unittest.TestCaseのunittest.main(冗長)設定にアクセスする方法
unittest.main(verbosity=2)
unittest.TestCase
でこの情報にアクセスするにはどうすればよいですか?
これを達成する方法は、unittest.TestCase
とunittest.main
をファイルにサブクラス化することです。ここでは、変数を定義する(例えばglobalverb
)グローバルまたはクラスまたはシングルトンとして使用して、あなたがunittest.main
を上書きすることができます。
def main(*args, **kwargs):
# parse arguments etc to get the verbosity number or whatever
# ...
# set this number to the defined class
globalverb = verbose_number
return unittest.main(*args, **kwargs)
後で、unittest.TestCase
をサブクラス:
class MyTestCase(unittest.TestCase):
def my_special_function(self):
if globalverb ...
このアプローチでunittestに引き渡された引数から(派生した)TestCaseの冗長性、冗長性、その他の数と情報を使用することは可能です。
コメント歓迎。
私はMartjin Pietersのソリューションを動作させることができませんでした。unittest.mainは、テスト結果がグローバルに割り当てられる前に、初期化された時点でテストを実行するためだと思います。
global verbosity ... if verbosity >= 2: print("Keys' order: %s" % dd.keys())
パッチ適用に基づいていずれかの方法で問題:冗長性を知っておく必要があり、テストケースでは、私はのようなものを使用
def new_parseArgs(self, argv): global old_parseArgs,verbosity old_parseArgs(self, argv) verbosity = self.verbosity if __name__ == '__main__': # monkeypatch unittest.TestProgram.parseArgs() to save verbosity # in a global variable old_parseArgs = unittest.TestProgram.parseArgs unittest.TestProgram.parseArgs = new_parseArgs unittest.main()
:
は代わりに、私は私のinitialiationを置き換えますunittest.TestProgram
のサブクラス化は、unittest.TestProgram
を起動する前にパッチを入手しなければならないということです。 unittest.TestProgram
の方法が発見されるまで
python -m unittest discover -v
発見のケースで動作アプローチは、スタックを検索するinspect
モジュールを使用することです。しかし、それはあなたのテストケースを発見経由で実行されている場合に可能であることを行っていません:
import inspect
import unittest
def unittest_verbosity():
"""Return the verbosity setting of the currently running unittest
program, or 0 if none is running.
"""
frame = inspect.currentframe()
while frame:
self = frame.f_locals.get('self')
if isinstance(self, unittest.TestProgram):
return self.verbosity
frame = frame.f_back
return 0
私の解決策はかなり異なっていました。 monkeypatchingの代わりに、私はすべてのテストが特別に細工された起動スクリプトを使って起動されることを利用しました。それは様々な設定変数とセットアップ環境を集めているので、1つの追加のエクスポートを追加するだけでかなり簡単です。
テストを直接実行するのではなく、より一般的なケースでは、test -runner.sh(または何でも)を作成して、まったく同じシェル呼び出しを行いますが、余分なプレフィックスを付けます。
1枚の絵は言葉の何千もの価値があるので:
これは私のテストランナーである:
#!/usr/bin/env bash
VERBOSE=false
while getopts ":vt:" opt; do
case $opt in
t)
TEST_TO_RUN=$OPTARG
;;
v)
VERBOSE=true
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
ENVS=""
ENVS+=" PYTHONPATH=$PYTHONPATH:$PWD"
PARAMS=""
PARAMS+=" -s --nologcapture --with-id"
PARAMS+=" --cov-config=.apirc --cov-report html --with-cov"
SERVER_PRIMER="coverage run --rcfile=.apirc"
if [[ ! -z "$TEST_TO_RUN" ]]; then
PARAMS+=" $TEST_TO_RUN"
fi
if [[ "$VERBOSE" = true ]]; then
PARAMS+=" -v"
ENVS+=" TEST_VERBOSITY=2"
fi
eval "$ENVS nosetests $PARAMS"
RESULT_TEST=$?
そして、私はユニットテストでこのメソッドを持っている:
@property
def verbosity(self):
return int(os.environ.get('TEST_VERBOSITY', 0))
は、スタックを登りますunittest.main()によって作成された "TestProgram"インスタンスを見つけ、冗長フィールドにアクセスします。
class MyTestCase(unittest.TestCase):
def test_verbosity(self):
"""Return current verbosity"""
for f in inspect.getouterframes(inspect.currentframe()):
args, _,_, local_dict = inspect.getargvalues(f[0])
if args:
first_arg = args[0]
first_value = local_dict[first_arg]
if type(first_value).__name__ == "TestProgram":
return first_value.verbosity
-v
オプションにアクセスしたい場合は、テストでself._resultForDoCleanups.showAll
(unittest.TestCase
を継承)で確認できます。そのテストで-v
が呼び出された場合、このフィールドは真です。