【问题标题】:SpecFlow AfterScenario execute each time with total number of scenarios countSpecFlow AfterScenario 每次执行,场景总数
【发布时间】:2018-01-12 16:44:21
【问题描述】:

我创建了一个基类,用于在 C# 中为失败的测试用例截屏。我已将 specflow 与 MSTest 一起用于自动化测试。但是,问题是当场景失败时,系统会运行以下AfterScenario 方法来计算场景总数。例如,我当前的项目中有 40 个场景,假设场景#1 正在运行,并且在场景#1 执行后,AfterScenario 方法将调用,但每次场景调用 40 次。

基类代码

[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);
        }
    }
}

这是我继承 TakeScreenshot 类的测试类

[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(场景计数)?

【问题讨论】:

    标签: c# cucumber specflow


    【解决方案1】:

    你的钩子被调用了很多次,因为你已经在一个基类上实现了它。

    Hooks 类似于 Step 绑定,是全局定义的。所以你定义了 AfterScenario Hook 的次数是你有多少继承的类。 你只需要一次。 请参阅此实现以满足您的要求:https://github.com/techtalk/SpecFlow.Plus.Examples/blob/master/SeleniumWebTest/TestApplication.UiTests/Support/Screenshots.cs

    请查看 Gaspar Nagy 的博文:http://gasparnagy.com/2015/05/specflow-tips-problems-with-placing-step-definitions-to-base-classes/

    【讨论】:

    • 我已经通过连接AfterScenario 尝试了您的解决方案,并且没有基类,它可以完美运行。但我有一个问题......最初它没有工作它仍然在多次使用场景方法后运行,因为我在基础项目中有“TakeScreenshot”类,其中我有场景方法并且我的测试项目正在引用基础项目 dll。问题是为什么AfterScenario 在基础项目中多次运行?任何想法
    【解决方案2】:

    AfterScenario 用于在运行每个场景后执行。其他hook attributes 更适合您的任务(也许是AfterTestRun)。

    【讨论】:

    • 感谢@Ivan R 的回答,我会看看,但AfterTestRun 将在每个功能文件之后执行,而且我正在为每个失败的场景截屏if (ScenarioContext.Current.TestError != null) { TakeScenarioScreenshot(Tools.driver); }
    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多