在步骤文件中使用pytest-bdd中的专用类从yaml加载数据(@given,@when,@then)

问题描述 投票:0回答:1

如何解决从 pytest-bdd 中的 steps.py 中的 yaml 捕获数据的问题。在框架的其他部分,一切都按其应有的方式进行。我有课:

class Globals:
    TITLE = None
    USERNAME1 = None
    LAST_NAME1 = None
    PASSWORD1 = None
    WRONG_PASSWORD = None
    EMAIL1 = None
    BDAY = None
    BMONTH = None
    BYEAR = None

    def __init__(self, path):
        self.load_data_from_yaml(path)

    def load_data_from_yaml(self, path):
        with open(path, "r") as param_file:
            try:
                yaml_file = yaml.safe_load(param_file)
                self.TITLE = yaml_file.get("title1")
                self.USERNAME1 = yaml_file.get("username1")
                self.PASSWORD1 = yaml_file.get("password1")
                self.WRONG_PASSWORD = yaml_file.get("wrong_password")
                self.LAST_NAME1 = yaml_file.get("lastname1")
                self.EMAIL1 = yaml_file.get("email1")
                self.BDAY = yaml_file.get("bday")
                self.BMONTH = yaml_file.get("bmonth")
                self.BYEAR = yaml_file.get("byear")


            except yaml.YAMLError as exc:
                print(exc)

    def get_yaml_element(self, element):
        return getattr(self, element, None)

和场景:

  Scenario Outline: Login to the website
    Given Navigate to login page
    When I enter my login and "<password>"
    And I click the login button
    Then I should get login alert

    Examples:
      | password        |
      | PASSWORD1       |
      | WRONG_PASSWORD  |

和步骤:

@when('I enter my login and <password>')
def step_when_enter_credentials(webdriver_initializer, password):
    driver = webdriver_initializer
    selenium_elements = Page(driver)
    globals_instance = Globals(PARAMS_PATH)
    password_to_use = globals_instance.get_yaml_element(password)
    selenium_elements.type_into(selenium_elements.EMAIL_ADDRESS_REGISTER_VALUE, selenium_elements.globals.EMAIL1)
    selenium_elements.type_into(selenium_elements.EMAIL_PASSWORD, password_to_use)

除了steps.py

globals_instance
工作正常,但在这种情况下我仍然有一个错误:

E   pytest_bdd.exceptions.StepDefinitionNotFoundError: Step definition is not found: When "I enter my login and "PASSWORD1"". Line 12 in scenario "Login to the website" in the feature "pytest_bdd/features/login.feature"
All traceback entries are hidden. Pass `--full-trace` to see hidden and internal frames.

我的问题是为什么?

python-3.x yaml bdd pytest-bdd
1个回答
0
投票

您遇到的错误消息 StepDefinitionNotFoundError 表示 pytest-bdd 无法找到与步骤“我输入登录名和“PASSWORD1”匹配的步骤定义。当 pytest-bdd 无法将步骤定义与步骤进入功能文件。

就您而言,问题似乎与您在步骤定义中使用占位符的方式以及从功能文件传递密码参数的方式有关。

在您的功能文件中,您有:

当我输入登录名和“”时 这表明您正在将占位符传递给步骤定义。但是,在您的步骤定义函数中,您没有正确处理此占位符。相反,您直接接收密码参数:

@when('I enter my login and <password>')
def step_when_enter_credentials(webdriver_initializer, password):

要正确处理步骤定义中的占位符,您应该使用与功能文件中相同的占位符名称,然后需要使用 Globals 类中的 get_yaml_element 方法将占位符替换为实际值。以下是修改步骤定义的方法:

@when('I enter my login and "{password}"')
def step_when_enter_credentials(webdriver_initializer, password):
    driver = webdriver_initializer
    selenium_elements = Page(driver)
    globals_instance = Globals(PARAMS_PATH)
    password_to_use = globals_instance.get_yaml_element(password)
selenium_elements.type_into(selenium_elements.EMAIL_ADDRESS_REGISTER_VALUE, selenium_elements.globals.EMAIL1)
selenium_elements.type_into(selenium_elements.EMAIL_PASSWORD, password_to_use)

此修改确保 pytest-bdd 可以将步骤定义与功能文件中的步骤正确匹配,并且应该解决 StepDefinitionNotFoundError 问题。

© www.soinside.com 2019 - 2024. All rights reserved.