chmp / ipytest

Pytest in IPython notebooks.
MIT License
314 stars 17 forks source link

Cannot find @given for pytest-bdd #25

Closed sunbiz closed 4 years ago

sunbiz commented 5 years ago

When executing pytest_bdd tests, the definitions are not found. I have tried both the ipytest.run() as well as %%run_pytest[clean] but the step definitions are not identified in the file.

pytest_bdd.exceptions.StepDefinitionNotFoundError: Step definition is not found:

The following is a straightforward Gherkin feature file:

Feature: DuckDuckGo Web Browsing

  Background:
    Given the DuckDuckGo home page is displayed

  Scenario: Basic DuckDuckGo Search
    When the user searches for "panda"
    Then results are shown for "panda"

and the steps code:

import pytest_bdd
import pytest
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options

options = Options()
options.headless = True

DUCKDUCKGO_HOME = 'https://duckduckgo.com/'

@pytest.fixture
def browser():
  driver = Firefox(options=options)
  driver.implicitly_wait(10)
  yield driver
  driver.quit()

@pytest_bdd.scenario('websearch.feature','Basic DuckDuckGo Search', features_base_dir='', strict_gherkin=False)
def test_websearch():
    pass

@pytest_bdd.given('the DuckDuckGo home page is displayed')
def ddg_home(browser):
    browser.get(DUCKDUCKGO_HOME)

@pytest_bdd.when(pytest_bdd.parsers.parse('the user searches for "{phrase}"'))
def search_phrase(browser, phrase):
    search_input = browser.find_element_by_id('search_form_input_homepage')
    search_input.send_keys(phrase + Keys.RETURN)

@pytest_bdd.then(pytest_bdd.parsers.parse('results are shown for "{phrase}"'))
def search_results(browser, phrase):
    links_div = browser.find_element_by_id('links')
    assert len(links_div.find_elements_by_xpath('//div')) > 0
    search_input = browser.find_element_by_id('search_form_input')
    assert search_input.get_attribute('value') == "phrase"

On the other hand, running these from the command-line using pytest works perfectly fine. Has anyone experienced this before?

chmp commented 5 years ago

Thanks for the report. Since I am not familiar with pytest-bdd it's hard for me to follow up.

Your example involves multiple dependencies, including selenium, and various test-cases. Would it be possible to post a minmal example with as little code as possible and only involvling pytest, pytest-bdd and ipytest?

chmp commented 4 years ago

Closing for now. Please feel free to re-open the issue with a minimal example.