2016-11-11 3 views
0

Djangoでカスタムテストランナーを作成してカスタム引数 '--headless'を追加しましたが、副作用としてデフォルトの引数を使用できません。私はDjango 1.9.11を使用しています。私のテストランナーコードは次のとおりです。Djangoカスタムテストランナーは、デフォルトのテスト引数の一部を削除します

from django.test.runner import DiscoverRunner   
class IbesTestRunner(DiscoverRunner): 
    @classmethod          
    def add_arguments(cls, parser): 
     parser.add_argument(
      '--headless', 
      action='store_true', default=False, dest='headless', 
      help='This is custom optional arguments for IBES.' 
      'Use this option to do browser testing without GUI') 

このテストランナーを使用して./manage.py test -hの結果は次のとおりです。

usage: manage.py test [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] 
        [--pythonpath PYTHONPATH] [--traceback] [--no-color] 
        [--noinput] [--failfast] [--testrunner TESTRUNNER] 
        [--liveserver LIVESERVER] [--headless] 
        [test_label [test_label ...]] 
. . . 

デフォルトのテストランナーを使用している間、./manage.py test -hの結果は次のとおりです。

usage: manage.py test [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] 
        [--pythonpath PYTHONPATH] [--traceback] [--no-color] 
        [--noinput] [--failfast] [--testrunner TESTRUNNER] 
        [--liveserver LIVESERVER] [-t TOP_LEVEL] [-p PATTERN] 
        [-k] [-r] [-d] [--parallel [N]] 
        [test_label [test_label ...]] 
... 

-k、-p、-rなどの引数を使用できないことに注意してください。 カスタムテスト引数を追加できますが、デフォルトのテスト引数を失うことはできません。

答えて

0

テストランナーがジャンゴ/コア/管理/コマンド/ test.py

class Command(BaseCommand): 
    help = 'Discover and run tests in the specified modules or the current directory.' 
    # ... more code goes here 
    def add_arguments(self, parser): 
     test_runner_class = get_runner(settings, self.test_runner) 

     if hasattr(test_runner_class, 'add_arguments'): 
      test_runner_class.add_arguments(parser) 
    # ... more code goes here 

にロードされているDjangoは、テストランナーで定義された引数を追加しますが、add_argumentsclass methodとデフォルトの動作ですDiscoverRunner.add_argumentsメソッドを明示的に実行しない限り省略されます。

だから、解決策は、このようなもの、自分の親のIbesTestRunnerクラスのadd_argumentsを呼び出すことです:答えのための

from django.test.runner import DiscoverRunner   
class IbesTestRunner(DiscoverRunner): 
    @classmethod          
    def add_arguments(cls, parser): 
     parser.add_argument(
      '--headless', 
      action='store_true', default=False, dest='headless', 
      help='This is custom optional arguments for IBES.' 
       'Use this option to do browser testing without GUI') 
     # Adding default test runner arguments. 
     # Remember python takes care of passing the cls argument. 
     DiscoverRunner.add_arguments(parser) 
+0

おかげで、それは働きました。私はPythonでクラスについてもっと学ぶ必要があると思う。これは一般的なPythonクラスの特徴ですか、またはdjango特有ですか?なぜいくつかの議論だけが欠落していますか? – pupil

+1

これはPythonの機能です。メソッドを定義し、それを 'classmethod'デコレータでデコレートする場合、正しいメソッド定義には最初の引数(慣習的に' cls')が含まれていなければなりません。明示的に呼び出す必要があるとき、pythonはクラスを 'cls'残りの引数は(メソッド定義で必要な場合のみ)送信する必要があります。詳細は、ドキュメントを参照してください。https://docs.python.org/2/library/functions.html?highlight=classmethod#classmethod – slackmart

関連する問題