Search code examples
python-3.xcucumberpytestpytest-bdd

Step implementation not found pytest-bdd


I've been using pytest and pytest-bdd v3.4 for running UI tests. For some reason the following error is occuring. pytest_bdd.exceptions.StepDefinitionNotFoundError: Step definition is not found.

The function was implemented, but pytest is unable to locate it. i have been reading that the possible explanation for that is due to the pytest-bdd version 4, I have downgraded it to 3.4, but the problem persists.

test_login.py

import time

import pytest
from Pages.pageFactory import PageFactory

from pytest_bdd import scenarios, given, when, then

# Scenarios
from Utils.enum import Page

scenarios('../features/login.feature')


@pytest.fixture
def context():
    b = None
    yield b


# Given Steps

@given('El navegador se encuentra en la pantalla de prelogin')
def open_browser():
    context.page = PageFactory.getPage(Page.auth)
    context.page.openAuthPage()


# When Steps

@when('El usuario presiona el boton de BancoFassil')
def push_fassil_button():
    context.page.checkPreLoginPage()
    context.page.acceptButton()
    time.sleep(5)


@then('La pantalla Login es desplegada')
def login_page_displayed():
    context.page = PageFactory.getPage(Page.login)
    context.page.checkLoginPage()


# Then Steps
@given('El navegador se encuentra en la pantalla de login')
def login_page():
    context.page = PageFactory.getPage(Page.login)
    context.page.checkLoginPage()
    time.sleep(5)


@when('El usuario ingresa el nuevo user')
def step_impl():
    context.page.insertUsername("user7")


@when('El usuario ingresa la password')
def step_impl(context):
    context.page.insertPassword("12345")


@when('El boton ingresar es presionado')
def push_login_button():
    context.page.login()
    time.sleep(5)


@then('La pantala de terminos y condiciones es desplegada')
def terms_conditions_page_displayed():
    context.page = PageFactory.getPage(Page.termsAndConditions)
    time.sleep(5)
    context.page.checkTermsAndConditionsPage()



@given('El navegador se encuentra en la pantalla de terminos y condiciones')
def terms_conditions():
    context.page = PageFactory.getPage(Page.termsAndConditions)
    time.sleep(5)
    context.page.checkTermsAndConditionsPage()


@when('El boton aceptar es presionado')
def push_login_button():
    context.page.acceptButton()


@then('La pantalla Home es desplegada')
def terms_conditions_page_displayed():
    context.page = PageFactory.getPage(Page.home)
    time.sleep(5)
    context.page.checkHomePage()

login.feature

Feature: Login a la plataforma

  Scenario: PreLogin
    Given El navegador se encuentra en la pantalla de prelogin
    When El usuario presiona el boton de BancoFassil
    Then La pantalla Login es desplegada

  Scenario: Login
    Given El navegador se encuentra en la pantalla de login
    When El usuario ingresa el nuevo user
      And El usuario ingresa la password
      And El boton ingresar es presionado
    Then La pantala de terminos y condiciones es desplegada


  Scenario: Terminos y Condiciones
    Given El navegador se encuentra en la pantalla de terminos y condiciones
    When El boton aceptar es presionado
    Then La pantalla Home es desplegada

The problem persists with the Login Scenario : Step definition is not found: When "El usuario ingresa el nuevo user


Solution

  • You have two functions with the same name, but different annotations for steps, and you are missing the context parameter:

    @when('El usuario ingresa el nuevo user')
    def step_impl():
        context.page.insertUsername("user7")
    
    
    @when('El usuario ingresa la password')
    def step_impl(context):
        context.page.insertPassword("12345")
    

    Rename the one or both of the functions, add the context parameter and you should be fine:

    @when('El usuario ingresa el nuevo user')
    def enter_username(context):
        context.page.insertUsername("user7")
    
    
    @when('El usuario ingresa la password')
    def enter_password(context):
        context.page.insertPassword("12345")