2012-12-07 7 views

答えて

3

これを達成する方法は、unittest.TestCaseunittest.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の冗長性、冗長性、その他の数と情報を使用することは可能です。

コメント歓迎。

2

私はMartjin Pietersのソリューションを動作させることができませんでした。unittest.mainは、テスト結果がグローバルに割り当てられる前に、初期化された時点でテストを実行するためだと思います。

 
      global verbosity 

    ... 

      if verbosity >= 2: 
       print("Keys' order: %s" % dd.keys()) 
5

パッチ適用に基づいていずれかの方法で問題:冗長性を知っておく必要があり、テストケースでは、私はのようなものを使用

 
    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 
1

私の解決策はかなり異なっていました。 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)) 
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 
1

-vオプションにアクセスしたい場合は、テストでself._resultForDoCleanups.showAllunittest.TestCaseを継承)で確認できます。そのテストで-vが呼び出された場合、このフィールドは真です。

関連する問題