[英]Specflow - Could we pass parameters in the Specflow Example Table
[英]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.