0

我有几个包含多个场景的 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表中有两行,如何根据环境只执行一次。

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

4

2 回答 2

1

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

创建一个 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 值,它将提取您设置的任何员工信息。如果您的数据是静态的,这将非常有用。我仍然更喜欢先创建搜索条件,然后再搜索,这样您就不必做所有这些了,哈哈。

于 2019-08-01T11:16:28.113 回答
0

由于您已经在步骤中传递了环境,因此我会亲自将该值传递给数据库对象构造函数,该构造函数根据构造函数输入从您的 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 中的 name 参数来选择您的环境<connectionStrings>。EF 会自动执行此操作,但如果您使用 ado.net,您仍然可以执行类似操作。

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

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

于 2019-08-01T20:46:47.613 回答