【问题标题】:How to implement different data for cucumber scenarios based on environment黄瓜场景如何根据环境实现不同的数据
【发布时间】:2015-06-25 04:11:16
【问题描述】:

我在不同环境中执行 cucumber-jvm 场景时遇到问题。包含在场景特征文件中的数据属于一个环境。为了在不同的环境中执行场景,我需要根据要执行的环境更新特征文件中的数据。

例如,在以下场景中,我将搜索条件包含在功能文件中。搜索条件适用于 QA 环境。

Scenario: search user with valid criteria

Given user navigated to login page
And clicked search link
When searched by providing search criteria
|fname1  |lname1  |address1|address2|city1|state1|58884|
Then verify the results displayed 

它在 QA 环境中运行良好。但是要在其他环境(UAT,stage..)中执行相同的场景,我需要根据这些环境中的数据修改特征文件中的搜索条件。

我正在考虑在不同环境的属性文件中维护场景的数据,并根据执行环境读取它。

如果数据在属性文件中,场景将如下所示。而不是搜索条件,我将给出 propertyName:

Scenario: search user with valid criteria

Given user navigated to login page
And clicked search link
When searched by providing search criteria
|validSearchCriteria|
Then verify the results displayed 

有没有其他方法可以维护所有环境的场景数据并根据场景正在执行的环境使用它?请告诉我。

谢谢

【问题讨论】:

    标签: cucumber cucumber-jvm gherkin


    【解决方案1】:

    我明白这个问题,但我不太明白这个例子,所以请允许我提供我自己的例子来说明如何解决这个问题。

    假设我们测试了一个图书馆管理软件,并且在我们的开发环境中,我们的测试数据包含 3 本书 Leo Tolstoy。

    我们可以有这样的测试用例:

    Scenario: Search by Author
        When I search for "Leo Tolstoy" books
        Then I should get result "3"
    

    现在假设我们创建了 QA 测试环境,在该环境中我们有 5 本书 Leo Tolstoy。问题是我们如何修改我们的测试用例,使其在两种环境中都能正常工作?

    一种方法是使用标签。例如:

    @dev_env
    Scenario: Search by Author
        When I search for "Leo Tolstoy" books
        Then I should get result "3"
    
    @qa_env
    Scenario: Search by Author
        When I search for "Leo Tolstoy" books
        Then I should get result "5"
    

    这里的问题是我们有很多代码重复。我们可以通过使用 Scenario Outline 来解决这个问题,如下所示:

    Scenario Outline: Search by Author
        When I search for "Leo Tolstoy"
        Then I should see "<number_of_books>" books
    
    @qa_env
    Examples:
    | number_of_books |
    | 5               |
    
    @dev_env
    Examples:
    | number_of_books |
    | 3               |
    

    现在当你执行测试时,你应该在开发环境中使用@dev_env标签,在QA环境中使用@qa_env。

    我很高兴听到解决此问题的其他方法。

    【讨论】:

    • 嗨 Dragan,这在 Serenity BDD Cucumber 中不起作用。有什么办法解决这个问题吗?
    【解决方案2】:

    你可以通过两种方式做到这一点

    1. 把编程往上推,这样你就可以按照你运行cucumber的方式传入搜索条件了

    2. 下推编程,以便您的步骤定义使用环境来决定从何处获取有效搜索条件

    这两个都涉及编写一个更抽象的功能,它不指定搜索条件的详细信息。所以你最终应该得到一个类似的功能

    Scenario: Search with valid criteria
      When I search with valid criteria
      Then I get valid results
    

    我将使用第二种方法来实现这一点,并将步骤定义编写如下:

    When "I search with valid criteria" do
      search_with_valid_criteria
    end
    
    module SearchStepHelper
      def search_with_valid_criteria
        criteria = retrieve_criteria
        search_with criteria
      end
    
      def retrieve_criteria
        # get the environment you are working in
        # use the environment to retrieve the search criteria
        # return the criteria
      end
    end
    World SearchStepHelper
    

    请注意,我所做的只是将您工作的位置从功能更改为模块中的辅助方法。

    这意味着当您使用正确的编程语言(而不是功能)进行编程时,您可以做任何您想做的事情以获得正确的标准。

    【讨论】:

    • 感谢详细解释的回复。我将在我的项目中使用第二种方法进行数据管理。
    • 如果在多个场景中(或)在同一场景中多次使用相同的步骤并且每次步骤数据都不同,如何检索数据?我是否需要按场景名称维护步骤的数据并检索场景名称的基础?
    • 您可能需要问另一个问题并更详细地解释自己。在上面的答案中,valid_criteria 不应该在场景内或场景之间改变。如果您想使用不同的标准集进行搜索,您可以为每个标准命名,例如 invalid_criteria、no_results_criteria。在 Cucumber 中,您在场景中谈论的内容在您的测试域中应该是明确的。
    【解决方案3】:

    这可能已在其他地方得到解答,但我目前合作的团队倾向于将特定于环境的先决条件下推到步骤定义背后的代码中。

    一种方法是在运行测试运行器类的进程中将环境名称设置为环境变量。例如,$ENV 设置为“Dev”。然后 @Before 测试每个场景,可以验证正在执行场景的环境并加载场景所需的任何特定于环境的数据:

    @Before
    public void before(Scenario scenario) throws Throwable {
    
        String scenarioName = scenario.getName();
    
        env = System.getenv("ENV");
        if (env == null) {
            env = "Dev";
        }
    
        envHelper.loadEnvironmentSpecificVariables();
    
    }
    

    这里我们设置了一个“默认”值“Dev”,以防测试运行程序在没有设置环境变量的情况下运行。 envHelper 指向一个带有方法 loadEnvironmentSpecificVariables() 的测试实用程序类,它可以从 JSON、csv、XML 文件中加载数据,其中包含特定于测试环境的数据。

    这种方法的一个优点是它可以帮助消除功能文件的混乱,使其免受可能会影响开发和测试领域之外的功能可读性的环境元数据的干扰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多