2017-02-28 1 views
1

TLDR - 서로 뒤 따르고 데이터를 공유하는 specFlow 시나리오를 작성하는 가장 좋은 방법은 무엇입니까? 예 : 시나리오 A - 사용자를 생성 한 다음 시나리오 B가 해당 사용자로 로그인합니다 (로그인에는 사용자 생성 시나리오에 지정된 사용자 이름과 암호가 필요합니다).서로 따르고 데이터를 공유하는 specflow 시나리오를 작성하는 방법은 무엇입니까?

안녕 모두,

난을 테스트 시나리오 다음 웹 사이트에서 일반적인 사용자 등록 양식에 대한 시나리오를 작성하는 최선의 방법을 해결하려고 노력에 피클의 비트에 자신을 얻고있다 로그인.

이 단계에 도달하면 내 등록 양식의 모든 세부 정보를 저장하기 위해 별도의 클래스 인스턴스를 만들려고했습니다 (컨텍스트 삽입이라고 생각합니다). 예 :

[Binding] 
public class AdmissionsPortalFeaturesSteps : BaseStep 
{ 
    private UserDetails userDetails; 

userDetails.Password 

이 ... 나는 다음과 같은 시나리오는 데 문제는 이전 시나리오 중에 생성 된 암호가 필요하고, 내가 뭔가 등으로 액세스 할 수 아니에요 내가 첫 번째 시나리오의 암호 값을 두 번째 시나리오로 전달하려고 할 때 현재 작동하지 않는 것은 무엇입니까? (필드가 '임의'로 설정되면 임의의 값이 내 C# 코드에서 생성됩니다)

Scenario: Create a new user via the Admissions Portal 
    Given I will navigate to the Admissions Portal login page 
    When I click the Create an Account link 
    Then I will be on the ontrack: prospect - Register page 
    Given I have entered the following values on the registration page 
    | fieldName     | value | 
    | Title      | random | 
    | Firstname     | random | 
    | Middlename     | random | 
    | Surname     | random | 
    | DOB      | random | 
    | Gender      | random | 
    | EmailAddress    | random | 
    | MobileNumber    | 0  | 
    | Password     | random | 
    | SecurityQuestion   | random | 
    | SecurityAnswer    | random | 
    And I click on the Register button 
    Then I will be on the Login page 
     And I will get a popup confirming my registration details 
    Then I close the browser window 

Scenario: I am able to login to the Admissions Portal with a newly created user 
    Given I will navigate to the Admissions Portal login page 
     And I enter a username and password and click to login 
    Then I will be on the ontrack: prospect - Home page 
    Then I close the browser window 

현재 다음 옵션이 있음을 알았습니다.

  1. 로그인을 포함하고 컨텍스트 삽입을 사용하여 단계간에 데이터를 공유하도록 첫 번째 시나리오를 확장하십시오.
  2. 로그인 단계에서 테이블을 포함하는 등록 단계를 반복하십시오.
  3. 테이블없이 사용자를 생성하는 새로운 짧은 단계를 작성하고 두 시나리오에서이 단계를 사용하십시오. 나중에 양식에 특정 값이 설정된 시나리오를 지정하고 싶지만이를 제거하는 것이 더 나을 수도 있습니다.

아니면 뭔가 내가 생각 적이 없다 ...

많은 감사,

내 specflow 시나리오는 데이터를 공유하지 않는 것을 확인하려고

답변

2

, 그리고 명시 적으로 할 수있는 경우 가능하면 각 테스트 사이에서 전체 데이터베이스 스키마를 다시 생성하십시오.

이 당신이 시험에 배열 만 데이터가 데이터베이스

그래서 계정을 생성하기위한 모든 단계를 통해 실행하거나 별도의 주어 단계를 만드는 것 (당신이 그 단계를 호출 할 수 있습니다에 있음을 보장합니다 프로그래밍 방식으로) 또는 별도의 감안할 때 단락 회로가 필요한 정보를 DB에 저장합니다.

또한 테스트에서 브라우저를 명시 적으로 닫았 음을 확인했습니다. 나는 Selenium을 시작/멈추는 웹을위한 BeforeScenario/AfterScenario 태그를 만든다. 그래서 당신의 테스트는 Selenium의 시작/중지가 아닌 실제 기능 만 테스트하면됩니다.

public class SeleniumController 
{ 
    public static readonly SeleniumController Instance = new SeleniumController(); 
    public static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(10); 

    public IWebDriver Selenium { get; private set; } 

    private void Trace(string message) { Console.WriteLine("-> {0}", message); } 

    public void Start() 
    { 
     if (Selenium != null) 
      return; 

     string appUrl = ConfigurationManager.AppSettings["AppUrl"]; 

     var options = new ChromeOptions(); 
     options.AddArgument("test-type"); 
     Selenium = new ChromeDriver(options); 
     Selenium.Manage().Timeouts().ImplicitlyWait(DefaultTimeout); 

     Trace("Selenium started"); 
    } 

    public void Stop() 
    { 
     if (Selenium == null) return; 

     try 
     { 
      Selenium.Quit(); 
      Selenium.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex, "Selenium stop error"); 
     } 
     Selenium = null; 
     Trace("Selenium stopped"); 
    } 
} 

시나리오 태그

public static class SeleniumSupport 
{ 
    private static bool ReuseWebSession 
    { 
     get { return ConfigurationManager.AppSettings["ReuseWebSession"] == "true"; } 
    } 

    [BeforeScenario("web")] 
    public static void BeforeWebScenario() 
    { 
     SeleniumController.Instance.Start(); 
    } 

    [AfterScenario("web")] 
    public static void AfterWebScenario() 
    { 
     if (!ReuseWebSession) 
      SeleniumController.Instance.Stop(); 
    } 
} 

추상적 인 단계 기본 클래스는

public abstract class SeleniumStepsBase 
{ 
    protected IWebDriver Selenium { get { return SeleniumController.Instance.Selenium; } } 
} 
+0

감사합니다. 그래, 좋은 생각 같아. 약간의 정리가 필요하므로 적절한 경우 전후를 추가합니다. – Konzy262

+0

셀렌 관리를위한 지원 코드를 추가하겠습니다. – Fran

0

나는 내가 시나리오 또는 기능 사이를 통과 정보를 저장하는 FeatureContext.Current 또는 ScenarioContext.Current를 사용 webdriver 셀레늄에 액세스 할 수 . FeatureContext는 Specflow 전역 사전으로 어디에서나 액세스 할 수 있습니다. Specflow FeatureContext

FeatureContext.Current["username"] = "someUsername"; 

또는

ScenarioContext.Current["username"] = "someUsername"; 
+0

단계 클래스에 컨텍스트를 삽입하지 않고 병렬 시나리오에서 작동하지 않으므로 데이터 공유 방법을 피할 것이고 향후 버전에서는 더 이상 사용되지 않을 것이라고 생각합니다 –

2

다른 시나리오에 대한 데이터를 설정하는 하나 개의 시나리오를 사용하여 귀하의 의도는 결함 및 실패 이럴 운명이다.

시나리오는 완전히 독립적이어야하며 다른 시나리오에 의존하지 않고 격리되어 실행할 수 있어야합니다. Specflow는 단위 테스트 생성 프레임 워크이지만 테스트 주자는 테스트를 실행할 순서를 결정할 수 있습니다. 자신이 원하는대로의 의존성이 있다면, 순서대로 실행하지 않으면 어떻게됩니까? 병렬로 실행하면 어떻게됩니까? 이 작품을 만들기 위해 노력하는 것은 상류에서 수영을 할 것입니다.하지 마십시오.

대신 각 시나리오를 자체 포함하십시오. 반복되는 설정이 많은 경우 배경 단계에 배치하거나 다른 모든 단계를 호출하여 설정을 수행하는 단계를 만들거나 원하는 설정 만 수행하는 단계를 만든 다음 표준 방법을 사용하십시오 생성 된 비밀번호 등을 관리하기위한 단계 들간에 데이터를 공유하는 것.

+1

감사합니다. Sam. 이걸 좀 더 들여다 보면 정확히 맞습니다. 한 시나리오에서 데이터를 설정하고 다른 모든 시나리오에서 해당 데이터를 사용하려고했습니다. 테스트가 잘못되어 실행 되었다면 당신이 지적했듯이 넘어 질 것입니다. 내 특정 등록을 사용자 시나리오로 유지하기로 결정한 다음 사용자 시나리오를 등록한 모든 단계를 호출하는 '사용자를 만들었습니다.'라는 더 짧은 버전을 사용합니다. 그런 다음 다른 시나리오의 설정으로 사용합니다. 테스트 실행 시간은 매번 사용자를 생성 할 때 더 길지만 테스트는 이제 완전히 독립적입니다. – Konzy262

-1

각 시나리오/스크립트를 독립적으로 작성하려고합니다. 실제로 통과해야하는 경우 스크립트 1로 만든 데이터를 Excel에 쓰고 다른 스크립트 2로 나중에 검색합니다. 하나의 실행/빌드에 대해 Excel 데이터가 유효합니다. 테스트가 다시 실행되면 Excel 데이터가 지워지고 스크립트 1은 데이터를 만들고 스크립트 2는이를 읽고 사용해야합니다. MS Excel Interop Excel dll을 사용했습니다.

관련 문제