TLDR - 编写相互遵循并共享数据的 specFlow 场景的最佳方式是什么?例如场景 A - 创建一个用户,然后场景 B 使用该用户登录(登录将需要在创建用户场景中指定的用户名和密码)。
大家好
我正在尝试找出最佳方法来为网站上的典型注册用户表单编写一个场景,然后是一个测试登录的场景。
我已经尝试创建一个单独类的实例来存储我的注册表单在到达此步骤时的所有详细信息(认为这是上下文注入(inject))。例如
[Binding]
public class AdmissionsPortalFeaturesSteps : BaseStep
{
private UserDetails userDetails;
我遇到的问题是以下场景需要在前一个场景中生成的密码,而我无法使用类似...的方式访问它
userDetails.Password
这是我目前无法使用的,因为我想将密码值从第一个场景传递到第二个......(请注意,如果该字段设置为“随机”,则会在我的c#代码)
Scenario: Create a new user via the Admissions Portal
Given I will navigate to the Admissions Portal login page
When I click the Create an Account link
Then I will be on the ontrack: prospect - Register page
Given I have entered the following values on the registration page
| fieldName | value |
| Title | random |
| Firstname | random |
| Middlename | random |
| Surname | random |
| DOB | random |
| Gender | random |
| EmailAddress | random |
| MobileNumber | 0 |
| Password | random |
| SecurityQuestion | random |
| SecurityAnswer | random |
And I click on the Register button
Then I will be on the Login page
And I will get a popup confirming my registration details
Then I close the browser window
Scenario: I am able to login to the Admissions Portal with a newly created user
Given I will navigate to the Admissions Portal login page
And I enter a username and password and click to login
Then I will be on the ontrack: prospect - Home page
Then I close the browser window
目前我看到我有以下选项
- 扩展第一个场景以包括登录以及使用上下文注入(inject)在步骤之间共享数据。
- 在我的登录步骤中重复包含表格的注册步骤。
- 编写一个新的更短的步骤,在没有表格的情况下生成我的用户,并在两种情况下都使用它(我可能想稍后指定在表单中设置特定值的情况,但承认我最好放弃它)。<
或者其他我没有想到的...
非常感谢,
最佳答案
我尝试确保我的 specflow 场景不共享任何数据,并且我是否可以在每次测试之间尽可能明确地重新生成整个数据库模式。
这确保数据库中只有您在测试中安排的数据
所以我会创建一个单独的 Given 步骤,它要么运行所有创建帐户的步骤(您可以通过编程调用这些步骤),要么有一个单独的 Given 步骤,用您需要的信息将所有种子数据库短路.
我还注意到您在测试中明确关闭了浏览器。我为启动/停止 Selenium 的 Web 创建了一个 BeforeScenario/AfterScenario 标签。这样您的测试只需要测试实际功能,而不需要测试 Selenium 的启动/停止。
public class SeleniumController
{
public static readonly SeleniumController Instance = new SeleniumController();
public static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(10);
public IWebDriver Selenium { get; private set; }
private void Trace(string message) { Console.WriteLine("-> {0}", message); }
public void Start()
{
if (Selenium != null)
return;
string appUrl = ConfigurationManager.AppSettings["AppUrl"];
var options = new ChromeOptions();
options.AddArgument("test-type");
Selenium = new ChromeDriver(options);
Selenium.Manage().Timeouts().ImplicitlyWait(DefaultTimeout);
Trace("Selenium started");
}
public void Stop()
{
if (Selenium == null) return;
try
{
Selenium.Quit();
Selenium.Dispose();
}
catch (Exception ex)
{
Debug.WriteLine(ex, "Selenium stop error");
}
Selenium = null;
Trace("Selenium stopped");
}
}
场景标签
public static class SeleniumSupport
{
private static bool ReuseWebSession
{
get { return ConfigurationManager.AppSettings["ReuseWebSession"] == "true"; }
}
[BeforeScenario("web")]
public static void BeforeWebScenario()
{
SeleniumController.Instance.Start();
}
[AfterScenario("web")]
public static void AfterWebScenario()
{
if (!ReuseWebSession)
SeleniumController.Instance.Stop();
}
}
访问selenium webdriver的抽象步骤基类
public abstract class SeleniumStepsBase
{
protected IWebDriver Selenium { get { return SeleniumController.Instance.Selenium; } }
}
关于c# - 如何编写相互跟随并共享数据的specflow场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42515676/