基础 class 中的 Specflow beforeScenario 调用多次,套件中的每个功能调用一次
Specflow beforeScenario in base class called multiple times, once for each feature in the suite
我有一个测试套件,它利用了我需要 运行 通过基础 class 的测试报告框架,一切正常,但 [BeforeScenario] 每个场景都被调用了 10 次我 运行,我套件中的每个功能都拆解了 1 次,奇怪的是拆解只有 运行 一次。
这是我的基地 class 的样子:
[Binding]
public class BaseStep : AllureReport
{
public DriverSupport _support;
public BaseStep(DriverSupport support)
{
_support = support;
}
[BeforeScenario]
public void Setup(FeatureContext context)
{
_support.startDriver();
AllureLifecycle.Instance.RunStep(() =>
{
TestContext.Progress.WriteLine(
$"Test \"{TestExecutionContext.CurrentContext.CurrentTest.FullName}\" is starting...");
});
}
[AfterScenario, Order(0)]
private void TearDown()
{
AllureLifecycle.Instance.RunStep(() =>
{
TestContext.Progress.WriteLine(
$"Test {TestExecutionContext.CurrentContext.CurrentTest.FullName}\" is stopping...");
});
}
这就是我的特征步骤文件的样子(其中有 10 个)
[Binding]
public class TestSteps1:BaseStep
{
public TestSteps1(DriverSupport support) : base(suppprt)
{
}
[Given(@"user goes to (.*)")]
public void GivenUserGoesTo(string p0)
{
_support.driver.GoToUrl(p0)
}
当我 运行 自己在一个功能中只有一个场景时,它会打印启动驱动程序并打印 "test xxx is starting..." 10 次,对于我拥有的每个功能一次,我只希望它 运行一次。
我考虑过将 beforescenario 移动到步骤 classes 本身,但我的许多功能使用来自多个步骤文件的步骤,所以我认为这会是一个问题。有什么方法可以使每个场景只有 运行s BeforeScenario 一次吗?
SpecFlow 将为它在您的测试项目中找到的每种类型执行 BeforeScenario 方法。看起来有10种类型定义或继承了这个方法:
- BaseStep class
- BaseStep
的每个子 class
当我希望 BeforeScenario 每次测试仅 运行 一次时 运行 我会将其放入自己的 "hooks" class.
因为前后挂钩都应该只执行一次,所以只需将它们都放在 SpecFlowHooks.cs
.
这样的地方
Selenium 网络驱动程序对象应在 SpecFlow 依赖注入框架中注册,并作为构造函数参数直接传递给每个步骤 class。鉴于您发布的代码,我不确定您的步骤定义的通用基础 class 是否有益。
有关使用 SpecFlow 正确注册 Selenium Web 驱动程序对象的更多信息,请参阅我对 的回答。
我有一个测试套件,它利用了我需要 运行 通过基础 class 的测试报告框架,一切正常,但 [BeforeScenario] 每个场景都被调用了 10 次我 运行,我套件中的每个功能都拆解了 1 次,奇怪的是拆解只有 运行 一次。
这是我的基地 class 的样子:
[Binding]
public class BaseStep : AllureReport
{
public DriverSupport _support;
public BaseStep(DriverSupport support)
{
_support = support;
}
[BeforeScenario]
public void Setup(FeatureContext context)
{
_support.startDriver();
AllureLifecycle.Instance.RunStep(() =>
{
TestContext.Progress.WriteLine(
$"Test \"{TestExecutionContext.CurrentContext.CurrentTest.FullName}\" is starting...");
});
}
[AfterScenario, Order(0)]
private void TearDown()
{
AllureLifecycle.Instance.RunStep(() =>
{
TestContext.Progress.WriteLine(
$"Test {TestExecutionContext.CurrentContext.CurrentTest.FullName}\" is stopping...");
});
}
这就是我的特征步骤文件的样子(其中有 10 个)
[Binding]
public class TestSteps1:BaseStep
{
public TestSteps1(DriverSupport support) : base(suppprt)
{
}
[Given(@"user goes to (.*)")]
public void GivenUserGoesTo(string p0)
{
_support.driver.GoToUrl(p0)
}
当我 运行 自己在一个功能中只有一个场景时,它会打印启动驱动程序并打印 "test xxx is starting..." 10 次,对于我拥有的每个功能一次,我只希望它 运行一次。
我考虑过将 beforescenario 移动到步骤 classes 本身,但我的许多功能使用来自多个步骤文件的步骤,所以我认为这会是一个问题。有什么方法可以使每个场景只有 运行s BeforeScenario 一次吗?
SpecFlow 将为它在您的测试项目中找到的每种类型执行 BeforeScenario 方法。看起来有10种类型定义或继承了这个方法:
- BaseStep class
- BaseStep 的每个子 class
当我希望 BeforeScenario 每次测试仅 运行 一次时 运行 我会将其放入自己的 "hooks" class.
因为前后挂钩都应该只执行一次,所以只需将它们都放在 SpecFlowHooks.cs
.
Selenium 网络驱动程序对象应在 SpecFlow 依赖注入框架中注册,并作为构造函数参数直接传递给每个步骤 class。鉴于您发布的代码,我不确定您的步骤定义的通用基础 class 是否有益。
有关使用 SpecFlow 正确注册 Selenium Web 驱动程序对象的更多信息,请参阅我对