2016-10-07 15 views
10

私はこれを理解する時間がありました。本当に私を悩ませていたので、誰もが同じ問題に遭遇した場合...PyTestのフィクスチャをPyCharm(タイプヒント)でオートコンプリートする方法

(と答えは、それが問題の核心は時々、常に、PyTestに備品を扱うないときということです:-)

問題

痛いシンプルなので、一顧ですPyCharmのテストでこれらのフィクスチャを使用すると、オートコンプリートヒントは得られません。テストの作成中に多数のメソッドを参照したいオブジェクトがある場合、テスト書込みプロセスに多くのオーバーヘッドと不便さが加わります。

は、ここで問題を説明するために単純な例です:

のは、私が住んでいるクラス「event_manager」を持っているとしましょう:

location.game.events 

レッツさらに(私のconftest.pyファイルでそれを言います不慣れなためPyTest標準のもの)、私は、そのクラスのインスタンスを返すの固定具持っている:私は、時々問題がありました(しかし常にではない

from location.game.events import event_manager 

... 

@pytest.fixture(scope="module") 
def event_mgr(): 
    """Creates a new instance of event generate for use in tests""" 
    return event_manager() 

を - )私はかなり理由を把握することはできませんこのようなクラスでは、フィクスチャを使用するテストコードでオートコンプリートが正しく機能しません。

def test_tc10657(self, evt_mgr): 
    """Generates a Regmod and expects filemod to be searchable on server""" 
    evt_mgr.(This does not offer autocomplete hints when you type ".") 

あなたはPyCharmタイプヒンティングを確認したら、そう答えは、実際には非常に簡単です: http://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html

ここでオートコンプリートが正しく動作するように、上記のテストコードを修正する方法は次のとおりです。

from location.game.events import event_manager 

... 

def test_tc10657(self, evt_mgr: event_manager): 
    """Generates a Regmod and expects filemod to be searchable on server""" 
    evt_mgr.(This DOES offer hints when you type "." Yay!) 

私がevent_manager型の入力パラメータとしてフィクスチャを明示的にどのようにタイプするかに注目してください。

+0

2016.2現在、PyCharmはpytestに特有の多くの機能をほとんど知らないです。インスペクションでは、同じファイルに定義されているフィクスチャの名前をシャドーイングしたり、フィクスチャ名からオートコンプリートを作成したりすることはありません。提案に感謝します。 –

+1

Python 2.7ではどうしたらいいですか?私はスタブファイルを使用して示唆jetbrains.comのリンクに従ってみましたが、私はそれを動作させるように見えることはできません。私の場合、私は 'セレンのインポートwebdriver'を行っています。私はPhantomJSブラウザを生成し、私の個別のテストでドライバオブジェクトの自動提案を得ることができません。 – bergonzzi

+0

私は、テストのパラメータにタイプアノテーションなしでこれをどうやって行うのがポイントかと思います。これはまだ便利ですが、テストケースごとに繰り返す必要はありません。 – gbonetti

答えて

1

また、関数にドキュメントストリングを追加し、パラメータのタイプを指定すると、それらのパラメータのコード補完が得られます。 pytestとセレンを使用して、例えば

# The remote webdriver seems to be the base class for the other webdrivers 
from selenium.webdriver.remote.webdriver import WebDriver 

def test_url(url, browser_driver): 
    """ 
    This method is used to see if IBM is in the URL title 
    :param WebDriver browser_driver: The browser's driver 
    :param str url: the URL to test 
    """ 
    browser_driver.get(url) 
    assert "IBM" in browser_driver.title 

はここでも

import pytest 
from selenium import webdriver 

# Method to handle the command line arguments for pytest 
def pytest_addoption(parser): 
    parser.addoption("--driver", action="store", default="chrome", help="Type in browser type") 
    parser.addoption("--url", action="store", default='https://www.ibm.com', help="url") 


@pytest.fixture(scope='module', autouse=True) 
def browser_driver(request): 
    browser = request.config.getoption("--driver").lower() 
    # yield the driver to the specified browser 
    if browser == "chrome": 
     driver = webdriver.Chrome(executable_path='/path/to/chromedriver') 
    else: 
     raise Exception("No driver for browser " + browser) 
    yield driver 
    driver.quit() 


@pytest.fixture(scope="module") 
def url(request): 
    return request.config.getoption("--url") 

のpython 2.7およびPycharm 2017.1を使用してテストされた私のconftest.pyファイルです。 docstring形式はreStructuredTextで、 "docstring内のPythonコードを解析する"チェックボックスは設定でチェックされています。

関連する問題