2017-12-07 41 views
1

하나의 기능 파일에 여러 개의 시나리오를 프로그래밍하고 있습니다. 하나의 큰 Steps 파일을 사용하여 시나리오 단계를 코드에 바인딩합니다.C# SpecFlow BeforeScenario 후크

예를 들어 제 기능 파일은 다음과 같다 :

Feature: Feature1 
    Description of feature1 

@TagA @TagB 
Scenario: Scenario1 
    Given Some form 
    When I press the submit button 
    Then I end up at a page 

@TagA 
Scenario: Scenario2 
    Given Some form 
    When I press cancel 
    Then I should end up at a different page 

그리고 내 단계 파일은 다음과 같다 :

내 단계 파일이 주어진 몇 가지 일반적인을 가진 기본 클래스에서 상속
using System; 
using TechTalk.SpecFlow; 

namespace UpdateServer.AcceptanceTests.StepFiles 
{ 
    [Binding] 
    [Scope(Feature = "Feature1")] 
    public class Feature1Steps : SeleniumTestsBaseClass 
    { 
     [BeforeScenario("TagA")] 
     public void BeforeScenarioTagA() 
     { 
      // prepare some stuff 
     } 

     [BeforeScenario("TagB")] 
     public void BeforeScenarioTagB() 
     { 
      // prepare some other stuff 
     } 

     [Given(@"Some form")] 
     public void GivenSomeForm() 
     { 
      // navigate to form 
     } 

     [When(@"I press the submit button")] 
     public void WhenIPressTheSubmitButton() 
     { 
      // press submit button 
     } 

     [When(@"I press cancel")] 
     public void WhenIPressCancel() 
     { 
      // press cancel button 
     } 

     [Then(@"I end up at a page")] 
     public void ThenIEndUpAtAPage() 
     { 
      // check url 
     } 

     [Then(@"I should end up at a different page")] 
     public void ThenIShouldEndUpAtADifferentPage() 
     { 
      // check url 
     } 
    } 
} 

공지 사항 , when, then bindings 그리고 Webdriver를 닫는 AfterScenario.

이제 시나리오 2를 실행하면 TagB의 BeforeScenario도 실행됩니다. OfCourse이 동작을 원하지 않습니다. 왜 SpecFlow가이 컨텍스트에서 TagB 코드를 실행합니까? 어떻게 그 일을 막을 수 있습니까?

편집은

SeleniumTestsBaseClass이 기본 클래스의 생성자에 셀레늄 WebDriver를 초기화하는 데 사용됩니다. 이것이 모든 단계 클래스가 기본 클래스에서 상속되기 때문에 범위가 단계 클래스에 추가 된 이유입니다. 이 범위 특성을 제거하면 WebDriver가 하나의 테스트 만 실행 중일 때도 모든 단계 파일에 대해 열립니다.

자주 묻는 질문 : WebDriver를 열 필요가 없는데도 WebDriver를 초기화하는 가장 좋은 장소는 무엇입니까?

+0

왜 스텝 클래스를 'Feature1'으로 범위를 지정 했습니까? 만약 당신이 그것을 제거하면 당신은 단지 'BeforeScenarioTagA' 시나리오 2에서 실행됩니다 믿습니다. 그러나 특정 이유에 대해 단계 클래스를 기능에 적용했는지 여부는 알 수 없으므로 유효한 대답인지 여부는 알 수 없습니다. –

+1

피쳐 결합 단계 정의는 반 패턴 btw입니다. - https://github.com/cucumber/cucumber/wiki/Feature-Coupled-Step-Definitions-%28Antipattern%29 –

답변

2

BeforeScenario 단계가 태그와 상관없이 모든 시나리오에 적용되는 이유는 클래스가 Feature1 기능에 적용되기 때문입니다.

시나리오에서 모든 태그를 제거하면 BeforeScenario 단계가 계속 실행됩니다. 기존 기능에 태그가없는 새로운 시나리오를 추가하는 경우와 동일합니다.

SpecFlow가 단계 클래스의 범위를 지정하는 것을 보았습니다. 태그 범위보다 우선 순위가 높습니다. 단계를 Feature1 단계로 실행합니다.

당신의 Feature1Steps 클래스에서 [Scope(Feature = "Feature1")] 속성을 제거 올바르게 내가 여부를 제거하는이에 대해 언급 할 수는 없지만 특정 기능에 당신이 범위를 선택한 이유는 모든 바인딩을 모르고 선택한 태그를 기준으로 특정 BeforeScenario 단계를 적용 범위는 좋은 생각입니다.

단계 정의를 기능과 시나리오에 연결하는 안티 패턴으로 간주되지만 자세한 내용은 Cucumber wiki을 참조하십시오.

+0

테스트를 위해 사용하는 모든 단계 파일은 내 테스트를 실행하는 데 사용하는 드라이버를 initiliazes하는 기본 클래스. 이 Scope을 제거하면 스코프가없는 모든 단계 파일이 생성되어 새 드라이버를 만드는 기본 클래스를 만듭니다.기본적으로 범위를 사용하지 않을 때는 많은 드라이버가 열립니다. 나는 Selenium과 SpecFlow를 함께 사용할 때 상속이 좋은 생각이 아니라는 것을 읽었다. 그러나 우리는 그것을 우리가 내부적으로 프로그래밍 한 API로 만드는 데 사용합니다. 상속을 제거하는 것을 고려해야합니까? – Jeroen

+0

스코프를 제거하면 더 많은 코드를 보지 않고 태그 링크 문제 – Jeroen

+1

@ Jeroen이 수정됩니다. 유감스럽게도 상속을 제거하는 것이 좋은 생각인지 여부는 언급 할 수 없습니다. 적어도 내 대답이 도움이 될 수 있기를 바랍니다. –