繁体   English   中英

Specflow - 如何从 Specflow 示例表传递环境特定数据

[英]Specflow - How to pass environment specific data from Specflow example table

我有几个包含多个场景的 Specflow 功能文件,我想在多个环境(DEV、TEST 和 SIT)中执行它们。

所以,我的问题是 - 将环境特定数据从特征文件传递到步骤定义的最佳方法是什么。 正如您在下面的示例中看到的,员工记录在每个环境中都不同。

Scenario Outline: Employee Search
Given Application is logged
And Search for employee record with <EmployeeName>, <EmployeeID>, <Company>, <Designation> and <Environment>
 Examples: 
        | EmployeeName| EmployeeID| Company  | Designation | Environment |
        | John Smith 1| 123       | ABC      | Analyst     | DEV         |
        | John Smith 2| 456       | DFG      | Manager     | TEST        |
        | John Smith 3| 789       | XYZ      | Sr Analyst  | SIT         |

[When(@"Search for employee record with (.*), (.*), (.*), (.*) and (.*)")]
    public void WhenSearchEmployee (string EmployeeName, string EmployeeID, string Company, string Designation, string Environment)
    {
        if (Environment== "DEV")
        {
            EmployeeRecord.SearchEmployee(EmployeeName, EmployeeID, Company, Designation);
        }
        else if (Environment== "TEST")
        {
            EmployeeRecord.SearchEmployee(EmployeeName, EmployeeID, Company, Designation);
        }
        else if (Environment== "SIT")
        {
            EmployeeRecord.SearchEmployee(EmployeeName, EmployeeID, Company, Designation);
        }
    }

编辑

  • 我正在使用app.config文件识别环境

基本上,我想在具有不同数据的多个环境(一次一个)中执行相同的测试用例。 另外,如果examples表中有两行,如何根据环境只执行一次。

这是正确的方法吗? 谢谢。

如果你不能每次都按需创建,这里有另一种方法。

创建一个 data.cs 文件。

public class EnvData
{
    public EnvData()
    {
        { 
            defaultEmail = "test@gmail.com";
            defaultPassword = "MyPass123";
        }


        if(ConfigurationManager.AppSettings["Env"] == "Test")
        {
            empName = "John Smith";
            EmployeeID = "1234";
            Company = "McDonalds";
            Designation = "McManager";
           
        }
        else if (ConfigurationManager.AppSettings["Env"] == "Dev")
        {
            empName = "Joe Smith";
            EmployeeID = "3456";
            Company = "McDonalds";
            Designation = "FryGuy";
           
        }
    }

      public static string defaultEmail;
      public static string defaultPassword;
      public static string empName;
      public static string EmployeeID;  //can be an int
      public static string Company;
      public static string Designation;

  }
}

然后在您的步骤文件中,我们使用上下文注入 - https://specflow.org/documentation/context-injection/

    private readonly EnvData _envData;

    public MyClassName(EnvData envData)
    {
        _envData = envData;
    }

您这样做的原因是,如果您需要更改数据,请在一个区域而不是在每个测试用例中更改它。

Scenario: Employee Search
Given Application is logged
And Search for an employee


  [When(@"Search for employee]
  public void WhenSearchEmployee ()
  {

  //would look something like this...

          EmployeeRecord.SearchEmployee(envData.empName, envData.EmployeeID, envData.Company, envData.Designation);
   
       }

因此,在上面的步骤中,该步骤将命中 envData 并根据环境的 appconfig 值,它将提取您设置的任何员工信息。 如果您的数据是静态的,这很有效。 我仍然更喜欢先创建搜索条件然后搜索,这样你就不必做所有这些了,哈哈。

由于您已经在步骤中传递了环境,因此我会亲自将该值传递给一个数据库对象构造函数,该构造函数根据构造函数输入从您的 app.config 切换连接字符串。

使用实体框架的示例:

public void WhenSearchEmployee (string EmployeeName, string EmployeeID, string Company, string Designation, string Environment) {    
    using (var context = new SomeContext(Environment)) {        
         // Search Employee code here
    }
}

然后,您可以将该值传递给 DbContext 基类,该基类可以通过匹配 app.config <connectionStrings>的 name 参数来选择您的环境。 EF 会自动执行此操作,但如果您使用的是 ado.net,您仍然可以执行类似操作。

public partial class SomeContext : DbContext {
    public SomeContext(string dbName) : base($"name={dbName}") {
    }
}

最后,无论何时您需要为您的步骤使用特定于环境的数据库,调用此上下文并传递环境名称将使您的所有步骤足够通用,而无需关心它们针对哪个环境执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM