2017-07-03 13 views
0

C#で失敗したテストケースのスクリーンショットを取得するための基本クラスを作成しました。私は、自動化テストのためにMSTestでspecflowを使用しました。しかし、問題は、シナリオが失敗して、シナリオ数の総数がAfterScenario以下のメソッドを実行する場合です。たとえば、私の現在のプロジェクトには40のシナリオがあります。シナリオ#1が実行中で、シナリオ#1の実行後にはAfterScenarioメソッドが呼び出されますが、各シナリオで40回呼び出されます。 SpecFlow AfterScenarioが毎回シナリオ数をカウントして実行する

基本クラスコード

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

これは私が

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

がn(シナリオ数)についてAfterScenario実行を防ぐために、とにかくありTakeScreenshotクラスを継承しています私のテストクラスですか?

答えて

1

フックは、基本クラスで実装されているので、何度でも呼び出されます。

フックは、ステップバインディングのように、グローバルに定義されています。そこでAfterScenarioフックを何回継承したクラスを何回も定義しました。 これは1回だけ必要です。 あなたの条件のために、この実装を参照してください:https://github.com/techtalk/SpecFlow.Plus.Examples/blob/master/SeleniumWebTest/TestApplication.UiTests/Support/Screenshots.cs

はガスパルナジのブログの記事を見てください:あなたの答えのためのhttp://gasparnagy.com/2015/05/specflow-tips-problems-with-placing-step-definitions-to-base-classes/

+0

私は' AfterScenario'をフックアップしてあなたのソリューションを試しました。しかし、私は質問があります...私はシナリオメソッドの後に持っている基本プロジェクトで 'TakeScreenshot'クラスを持っていて、私のテストプロジェクトは基本プロジェクトDLLを参照しているので、最初はそれはシナリオメソッドの後にまだ実行されていませんでした。問題は 'AfterScenario'が基本プロジェクトで複数回実行されていた理由ですか?何か案が –

0

AfterScenarioは、すべてのシナリオ実行後に実行されます。他のhook attributesはあなたの仕事(おそらくAfterTestRun)に適しています。

+0

おかげ@Ivan Rを、私は見てますが、 'AfterTestRun'は、それぞれの後に実行されます(ScenarioContext.Current.TestError!= null) { TakeScenarioScreenshot(Tools.driver);また、私は失敗したシナリオごとにスクリーンショットを取っています。 } ' –

関連する問題