SpecFlow AfterScenario 每次执行场景总数
SpecFlow AfterScenario execute each time with total number of scenarios count
我创建了一个基础 class 用于在 C# 中截取失败测试用例的屏幕截图。我将 specflow 与 MSTest 一起用于自动化测试。但是,问题是当场景失败时,系统运行下面的 AfterScenario
方法来计算场景总数。例如,我当前的项目中有 40 个场景,假设场景#1 是 运行 并且在场景#1 执行后 AfterScenario
方法将调用,但它调用 40 次,每次场景。
基础class代码
[Binding]
public abstract class TakeScreenshot : Steps
{
[AfterScenario]
public void AfterWebTest()
{
if (ScenarioContext.Current["run"]=="0")
{
if (ScenarioContext.Current.TestError != null)
{
TakeScenarioScreenshot(Tools.driver);
}
ScenarioContext.Current["run"] = "1";
}
}
private void TakeScenarioScreenshot(IWebDriver driver)
{
try
{
string fileNameBase = string.Format("{0}_{1}",
DateTime.Now.ToString("yyMMddHHmmssFFF") , ScenarioContext.Current.ScenarioInfo.Title);
var artifactDirectory = Path.Combine(Directory.GetCurrentDirectory(), "testresults");
if (!Directory.Exists(artifactDirectory))
Directory.CreateDirectory(artifactDirectory);
string pageSource = driver.PageSource;
string sourceFilePath = Path.Combine(artifactDirectory, fileNameBase + "_source.html");
File.WriteAllText(sourceFilePath, pageSource, Encoding.UTF8);
ITakesScreenshot takesScreenshot = driver as ITakesScreenshot;
if (takesScreenshot != null)
{
var screenshot = takesScreenshot.GetScreenshot();
string screenshotFilePath = Path.Combine(artifactDirectory, fileNameBase + "_screenshot.png");
screenshot.SaveAsFile(screenshotFilePath, ImageFormat.Png);
}
}
catch (Exception ex)
{
Console.WriteLine("Error while taking screenshot: {0}", ex);
}
}
}
这是我的测试 class 我正在继承 TakeScreenshot
class
[Binding]
public class CheckTwoNumberAreEqual : TakeScreenshot
{
[Given(@"Check two numbers are same")]
public void GivenChecktwonumbersaresame()
{
Assert.AreEqual(2, 3);
}
}
[Binding]
public class TestAddNewUser : TakeScreenshot
{
[Given(@"Add two numbers and check answer")]
public void GivenAddtwonumbersandcheckanswer()
{
int a=2+3;
Assert.AreEqual(2, a);
}
}
有没有办法阻止 AfterScenario
执行 n(场景计数)?
AfterScenario
用于每个场景运行后执行。其他 hook attributes 更适合您的任务(可能 AfterTestRun
)。
你的钩子被调用了这么多次,因为你在基础上实现了它class。
Hook 类似于 Step 绑定,它们是全局定义的。所以你定义了 AfterScenario Hook 很多次你有多少继承 classes。
你只需要一次。
请参阅此实现以满足您的要求:https://github.com/techtalk/SpecFlow.Plus.Examples/blob/master/SeleniumWebTest/TestApplication.UiTests/Support/Screenshots.cs
请查看 Gaspar Nagy 的博客post:http://gasparnagy.com/2015/05/specflow-tips-problems-with-placing-step-definitions-to-base-classes/
我创建了一个基础 class 用于在 C# 中截取失败测试用例的屏幕截图。我将 specflow 与 MSTest 一起用于自动化测试。但是,问题是当场景失败时,系统运行下面的 AfterScenario
方法来计算场景总数。例如,我当前的项目中有 40 个场景,假设场景#1 是 运行 并且在场景#1 执行后 AfterScenario
方法将调用,但它调用 40 次,每次场景。
基础class代码
[Binding]
public abstract class TakeScreenshot : Steps
{
[AfterScenario]
public void AfterWebTest()
{
if (ScenarioContext.Current["run"]=="0")
{
if (ScenarioContext.Current.TestError != null)
{
TakeScenarioScreenshot(Tools.driver);
}
ScenarioContext.Current["run"] = "1";
}
}
private void TakeScenarioScreenshot(IWebDriver driver)
{
try
{
string fileNameBase = string.Format("{0}_{1}",
DateTime.Now.ToString("yyMMddHHmmssFFF") , ScenarioContext.Current.ScenarioInfo.Title);
var artifactDirectory = Path.Combine(Directory.GetCurrentDirectory(), "testresults");
if (!Directory.Exists(artifactDirectory))
Directory.CreateDirectory(artifactDirectory);
string pageSource = driver.PageSource;
string sourceFilePath = Path.Combine(artifactDirectory, fileNameBase + "_source.html");
File.WriteAllText(sourceFilePath, pageSource, Encoding.UTF8);
ITakesScreenshot takesScreenshot = driver as ITakesScreenshot;
if (takesScreenshot != null)
{
var screenshot = takesScreenshot.GetScreenshot();
string screenshotFilePath = Path.Combine(artifactDirectory, fileNameBase + "_screenshot.png");
screenshot.SaveAsFile(screenshotFilePath, ImageFormat.Png);
}
}
catch (Exception ex)
{
Console.WriteLine("Error while taking screenshot: {0}", ex);
}
}
}
这是我的测试 class 我正在继承 TakeScreenshot
class
[Binding]
public class CheckTwoNumberAreEqual : TakeScreenshot
{
[Given(@"Check two numbers are same")]
public void GivenChecktwonumbersaresame()
{
Assert.AreEqual(2, 3);
}
}
[Binding]
public class TestAddNewUser : TakeScreenshot
{
[Given(@"Add two numbers and check answer")]
public void GivenAddtwonumbersandcheckanswer()
{
int a=2+3;
Assert.AreEqual(2, a);
}
}
有没有办法阻止 AfterScenario
执行 n(场景计数)?
AfterScenario
用于每个场景运行后执行。其他 hook attributes 更适合您的任务(可能 AfterTestRun
)。
你的钩子被调用了这么多次,因为你在基础上实现了它class。
Hook 类似于 Step 绑定,它们是全局定义的。所以你定义了 AfterScenario Hook 很多次你有多少继承 classes。 你只需要一次。 请参阅此实现以满足您的要求:https://github.com/techtalk/SpecFlow.Plus.Examples/blob/master/SeleniumWebTest/TestApplication.UiTests/Support/Screenshots.cs
请查看 Gaspar Nagy 的博客post:http://gasparnagy.com/2015/05/specflow-tips-problems-with-placing-step-definitions-to-base-classes/