2017-11-02 13 views
0

私はSpecFlowとTestStackWhiteで簡単なテストを書こうとしています.Hookファイルを作成してBeforeScenarioとAfterScenarioの定義を保存しました。問題は、テストを実行しようとすると失敗します。コードセクションのBeforeScenarioをHookファイルからTestSequenceSteps.csに移動すると、すべての問題は解決します。[Given(@"I have opened Test")] フックファイルを正しく参照するにはどうすればよいですか?SpecFlowのSequenceStepsでHookファイルを実行する

TestSequence.feature

Feature: TestSequence 
    Run full Test 
    as a test sequence 

@run 
Scenario: Run test sequence in Test 
    Given I have opened Test 
    When I press Test button 
    And I press Continue button 
    Then test sequnce is run 

Hooks1.cs

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using TechTalk.SpecFlow; 
using TestStack.White; 
using TestStack.White.Factory; 
using TestStack.White.UIItems.Finders; 
using TestStack.White.UIItems.WindowItems; 

namespace Test.Steps 
{ 

    [Binding] 
    public sealed class Hooks1 
    { 
     public static Window window; 
     public static Application application; 

     [BeforeScenario("run")] 
     public void BeforeScenario() 
     { 
      application = Application.AttachOrLaunch(new ProcessStartInfo("C:\\Program Files (x86)\\Tests\\" + 
      "directory\\Test.exe")); 
      window = application.GetWindow 
       (SearchCriteria.ByClassName("TGUI"), InitializeOption.NoCache); 
     } 

     [AfterScenario] 
     public void AfterScenario() 
     { 
      window.Close(); 
     } 
    } 

TestSequenceSteps.cs

using System; 
using TechTalk.SpecFlow; 
using TestStack.White; 
using TestStack.White.UIItems; 
using TestStack.White.UIItems.Finders; 
using NUnit.Framework; 
using TestStack.White.UIItems.WindowItems; 
using TestStack.White.UIItems.TabItems; 
using System.Threading; 
using System.Diagnostics; 
using TestStack.White.Factory; 
using System.Linq; 

namespace Test.StepDefinitions 
{ 

    [Binding] 
    public class TestSequenceSteps 
    { 
     private static Window window; 
     private static Application application; 

     [Given(@"I have opened Test")] 
     public void GivenIHaveOpenedTest() 
     { 

     } 

     [When(@"I press Test button")] 
     public void WhenIPressTestButton() 
     { 
      var button = window.Get<Button>(SearchCriteria.ByClassName("TButton")); 
      button.Click(); 
     } 

     [When(@"I press Continue button")] 
     public void WhenIPressContinueButton() 
     { 
      var button = window.Get<Button>(SearchCriteria.ByText("ContinueButton")); 
      Thread.Sleep(700); 
      button.Click(); 
     } 

     [Then(@"test sequnce is run")] 
     public void ThenTestSequnceIsRun() 
     { 
      //ScenarioContext.Current.Pending(); 
     } 
    } 
} 
+0

エラーとは何ですか? –

+0

ボタンを見つけることができません。「テストボタン - >エラー:オブジェクト参照がオブジェクトのインスタンスに設定されていません。」というエラーが表示されます。 – omnia

答えて

2

あなたはTestSequenceStepsでウィンドウのフィールドにアクセスするNullRef例外を取得し、この分野理由決して割り当てられません。 ステップクラス間でステートを静的フィールドと共有することはできません。

この状態を共有するには、Context Injection(http://specflow.org/documentation/Context-Injection/)を使用します。適用され、そのパターンで
、あなたのコードは次のように、その後になります。

public class SharedState 
{ 
    public Window Window {get;set;} 
    public Application Application {get;set;} 
} 


[Binding] 
public class Hooks1 
{ 
    private SharedState _sharedState; 

    public Hooks1(SharedState sharedState) 
    { 
     _sharedState = sharedState; 
    } 


    [BeforeScenario("run")] 
    public void BeforeScenario() 
    { 
     _sharedState.Application = Application.AttachOrLaunch(new ProcessStartInfo("C:\\Program Files (x86)\\Tests\\directory\\Test.exe")); 
     _sharedState.Window = _sharedState.Application.GetWindow(SearchCriteria.ByClassName("TGUI"), InitializeOption.NoCache); 
    } 

    [AfterScenario] 
    public void AfterScenario() 
    { 
     _sharedState.Window.Close(); 
    } 
} 

[Binding] 
public class TestSequenceSteps 
{ 
    private SharedState _sharedState; 

    public TestSequenceSteps(SharedState sharedState) 
    { 
     _sharedState = sharedState; 
    } 

    [Given(@"I have opened Test")] 
    public void GivenIHaveOpenedTest() 
    { 

    } 

    [When(@"I press Test button")] 
    public void WhenIPressTestButton() 
    { 
     var button = _sharedState.Window.Get<Button>(SearchCriteria.ByClassName("TButton")); 
     button.Click(); 
    } 

    [When(@"I press Continue button")] 
    public void WhenIPressContinueButton() 
    { 
     var button = _sharedState.Window.Get<Button>(SearchCriteria.ByText("ContinueButton")); 
     Thread.Sleep(700); 
     button.Click(); 
    } 

    [Then(@"test sequnce is run")] 
    public void ThenTestSequnceIsRun() 
    { 
     //ScenarioContext.Current.Pending(); 
    } 
} 
+0

ありがとうございました!それは動作しますが、今私が間違いを犯した場所を見ると、最も重要なことはあります:) – omnia

関連する問題