7

優れたBehaveフレームワークを使用していますが、OOP スキルが不足しているため問題が発生しています。

Behave には組み込みのコンテキスト名前空間があり、テスト実行ステップ間でオブジェクトを共有できます。WebDriver セッションを初期化した後、これを使用してステップ間でセッションを渡し続け、contextすべてを保持します。機能は問題ありませんが、以下に示すように、DRY ではありません。

step_impl()これらの属性をor contextonce onlyに追加する方法/場所を教えてください。

環境.py

from selenium import webdriver

def before_feature(context, scenario):
    """Initialize WebDriver instance"""

    driver = webdriver.PhantomJS(service_args=service_args, desired_capabilities=dcap)

    """
    Do my login thing..
    """

    context.driver = driver
    context.wait = wait
    context.expected_conditions = expected_conditions
    context.xenv = env_data

steps.py

@given('that I have opened the blah page')
def step_impl(context):

    driver = context.driver
    wait = context.wait
    expected_conditions = context.expected_conditions
    xenv = context.xenv

    driver.get("http://domain.com")
    driver.find_element_by_link_text("blah").click()
    wait.until(expected_conditions.title_contains("Blah page"))

@given(u'am on the yada subpage')
def step_impl(context):
    driver = context.driver
    wait = context.wait
    expected_conditions = context.expected_conditions
    xenv = context.xenv

    if driver.title is not "MySubPage/":
        driver.get("http://domain.MySubPage/")
        wait.until(expected_conditions.title_contains("Blah | SubPage"))

@given(u'that I have gone to another page')
def step_impl(context):
    driver = context.driver
    wait = context.wait
    expected_conditions = context.expected_conditions
    xenv = context.xenv

    driver.get("http://domain.com/MyOtherPahge/")
4

3 に答える 3

2

コンテキストを「アンパック」し、「アンパック」された値を引数として渡すデコレーターを定義できます。

環境.py

def before_feature(context, feature):
    context.spam = 'spam'

def after_feature(context, feature):
    del context.spam

テスト機能

Scenario: Test global env
  Then spam should be "spam"

step.py

def add_context_attrs(func):
    @functools.wraps(func)  # wrap it neatly
    def wrapper(context, *args, **kwargs):  # accept arbitrary args/kwargs
        kwargs['spam'] = context.spam  # unpack 'spam' and add it to the kwargs
        return func(context, *args, **kwargs)  # call the wrapped function
    return wrapper

@step('spam should be "{val}"')
@add_context_attrs
def assert_spam(context, val, spam):
    assert spam == val
于 2014-05-21T06:59:07.950 に答える
1

私が通常使用する DRY ルールに固執
する
:コントロール

于 2014-06-09T20:26:24.127 に答える