2012-01-19 8 views
1

셀레늄 그리드를 사용하여 셀프 2에 대해 RemoteWebDriver에 대해 많은 기사를 읽었습니다. 지금은 [Test] 속성을 사용하여 Test()에 내 테스트가 생성됩니다.데이터 구동 테스트 케이스를 사용하는 MBUnit/Gallio의 병렬 테스트

정보를 채우는 데 사용한 TestCriteria 클래스가 있고이 데이터를 테스트에 입력하는 방법을 '제어하는'방법으로 Selenium WebDriver '페이지 개체 디자인 패턴'을 사용합니다.

는 그래서, 예를 들어, 간단한 기준이 객체가 있습니다

public class Credentials 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
} 

는 그 다음 LoginPage 객체에서이 정보를 사용합니다.

public class LoginPage 
{ 
    [FindsByAnnotation] 
    public IWebElement UsernameField { get; set; } 

    [FindsByAnnotation] 
    public IWebelement PasswordField { get; set; } 

    [FindsByAnnotation] 
    public IWebelement SubmitButton { get; set; } 

    public HomePage Login(Credentials cred) 
    { 
     UsernameField.SendKeys(cred.user); 
     // code for login and return new HomePage object 
    } 
} 

이제 구조의 종류와 내가 테스트 데이터를 일단 내 시험에서 좋은 방법 체인을 만들 수 있어요, 내 자격 증명과 같은 일들이, 객체 등 다른 페이지에 기입해야 할 데이터 .

이 잘하고 좋은

[TestFixture] 
public class TestFixture 
{ 
    private IWebDriver driver; 
    private TestCaseData data; // Which contains a Credentials object etc etc 

    [SetUp] 
    public void SetUp() 
    { 
     data = new TestCaseData() 
     { 
       Credentials = new Credentials() 
       { 
        Username = "username", 
        Password = "password" 
       } 
      // Other test case data objects can be populated here 
     }; 

     driver = new FireFoxDriver(); 
    } 

    [Test] 
    public void Test() 
    { 
      new LoginPage().Login(data.Credentials) 
         .NavigateToSearchPage() 
         .EnterSearchCriteria(data.SearchCritiera) 
      // etc 
    } 

},하지만 ... 난 XML로 직렬화 복원 할 수있는 일련 TestData 사용 객체에서이 테스트 데이터를로드하고 싶었다면 무엇을.

나는 또한 IWebDriver driver = new FireFoxDriver();을 사용하는 것에 비해 여전히 flakey 인 RemoteWebDriver을 사용하고 싶습니다. 그러나이 문제를 무시하면서, 나는 한 번 이상 TESTCASE를 실행하고 싶습니다. 시각. 어느 것이 병렬 테스트의 문제로 다가 오나요?

나는 MBUnit이 Gallio의 일부인 이것을 처리 할 수 ​​있음을 알고 있으며, Nunit의 확장 인 PUnit을 살펴 봤지만 아직 갈 길이 멀다. 그래서 저는 MbUnit을 고수하기로했습니다.

이렇게하면 [Parallelizable] 속성으로 TestFixtures를 실행할 수 있습니다. 그래서 프로젝트를 컴파일하고 프로젝트 DLL을 Gallio TestRunner GUI에로드하면 동시에 4 개의 테스트 케이스를 실행할 수 있으며, 동시에 4 개의 테스트를 동시에 실행하면서 4 개의 브라우저를 실행하면서 동시에 사이트에 스트레스를 가할 수 있습니다 4 가지 테스트가 모두 실행됩니다. (셀레늄 그리드를 사용하는 셀레늄 RemoteWebDriver를 사용하여 여러 대의 브라우저에서 수백 대의 브라우저를 실행하는 것이 분명합니다. [Parallelizable] 속성은 테스트 픽스처의 맨 위에 추가되며, 예를 들어 C : \ TestCase 디렉토리의 1 - 10 .xml 파일을로드 한 후에 모두 동시에 실행하게합니다.

내 아이디어는 이것들은 모두로드 된 다음 Selenium Grid가 메인 Selenium 그리드 허브에 연결된 1 - 5 개의 Selenium 노드로 브라우저 세션을 처리하도록하십시오.

[SetUp][TearDown][Test]을 포함하고 무엇이로드되는지에 따라 테스트 속성에 특정 테스트 조건을 설정할 수있는 기능을 포함하는 Test Fixture을 생성 할 수있는 프레임 워크를 찾을 수 없을 때 Selenium Grid를 사용하는 데 어려움을 겪고 있습니다. TestCase .xml 파일에서.

예를 들어 TestCase .xml 파일에 실패한 요소가있는 경우 어떻게이 .xml 파일을로드하고 내 TestFixture의 [Test]에 속성을 설정하거나 TestCase를 매핑 할 수 있습니까?xml 런타임시 [Test(Description = "")] 특성에 대한 테스트 설명입니다.

저는 이미 셀레늄 webdriver의 기능, 페이지 객체 디자인 패턴, 스크린 샷을위한 셀렌 EventFiringWebDriver 기능을 알고 있습니다.

여러 XML 직렬화 된 TestCaseData로로드하는 기능을 어떻게 활용하고,로드 된 후에 새로운 TestFixture 객체를 생성 할 수 있습니까?

이상적으로 특정 URL은 TestCase.xml 파일에 포함 된 내용에 따라 달라 지므로 IWebDriver을 설정하려면 각 TestFixture의 [SetUp]을 설정하고 싶습니다. 예를 들어이 테스트는 UAT 환경에서 실행하는 것입니다. Test 환경, 사전 제작 환경, 테스트를 실행하기 전에이를 설정해야합니다.

누구나 Selenium Grid/Selenium WebDriver에서 이러한 테스트 설비를 병렬로 실행하여 여러 브라우저를 실행하는 Selenium Grid 기능을 활용할 수있는 이러한 기본 개념을 사용하는 기본 예제는 없습니다.

그래서 내가 의사 코드로 찾고있는 것이 있습니다.

public class Main() 
{ 
    // Load Testfixtures 
    List<TestCase> testCases = Deserialise("\\Some\\FolderLocation"); 

    foreach(test in testCases) 
    { 
     // create NEW testFixture, not [Test] 
     // ability to attach parallel TestFixture 
    } 
} 

[Testfixture] 
[Parallelizable] 
public class TestFixture 
{ 

    public TestCase testCase { get; set; } 
    public IWebDriver driver { get; set; } 

    [SetUp] 
    public void SetUp() 
    { 
     if(testCase.Environment == "UAT") 
     { 
      driver = new FireFoxDrive() 
      driver.NavigateTo("http://localhost/uat/Login"); 
     } 

     // What if the testCase.ShouldPass is false? 

     // How can i generate my [Test] with ExpectedException? 

    } 

     [Test] 
     public void Test() 
     { 
      // code here with page object method chaining passing in testCase data objects 
     } 
} 

어쩌면 나는이 디자인에 대해 잘못된 길을 가고 있습니다. 이러한 문제를 병렬 처리하는 가장 좋은 방법은 무엇입니까?

답변

1

어때?

public class TestCase 
{ 
    public string Name { get; set; } 
} 

public static class TestCaseFactory 
{ 
    public static IEnumerable<TestCase> TestCases() 
    { 
     yield return new TestCase { Name = "one" }; 
     yield return new TestCase { Name = "two" }; 
    } 
} 

[Factory(typeof(TestCaseFactory), "TestCases"), Parallelizable] 
public class DataDrivenFixture 
{ 
    private readonly TestCase testCase; 

    public DataDrivenFixture(TestCase testCase) 
    { 
     this.testCase = testCase; 
    } 

    [SetUp] 
    public void SetUp() 
    { 
     Console.WriteLine("SetUp " + testCase.Name); 
    } 

    [Test] 
    public void Test() 
    { 
     Console.WriteLine("Test " + testCase.Name); 
    } 
} 
+0

Nunit TestCaseSource를 사용하여 궁극적으로이 파일을 발견했습니다. 감사합니다 :) +1 –

0

좋은 해결책. 다른 브라우저에서 병렬 테스트를 실행하면 어떨까요? [FixtureSetUp]에서 IWebDriver를 초기화하면 브라우저가 테스트를 시작했지만 오류가 발생합니다 (기본적으로 NoSuchElement).

public static IEnumerable<TestCase> TestCases() 
     { 
      yield return new TestCase { Name = "internet explorer" }; 
      yield return new TestCase { Name = "firefox" }; 
     } 

[FixtureSetUp] 
     public void SetUp() 
     { 
      Console.WriteLine("SetUp " + testCase.Name); 
      switch (testCase.Name) 
      { 
       case "internet explorer": 
        driver = new InternetExplorerDriver(); 
        break; 
       case "chrome": 
        driver = new ChromeDriver(); 
        break; 
       case "firefox": 
        driver = new FirefoxDriver(); 
        break; 
      } 
     } 
+0

당신은 병렬로 테스트를 실행하려면 셀레늄 GRID를 최대한 활용해야합니다. 이 방법으로 셀레늄 그리드는 세션을 추적하고 요청을 보내야하는 브라우저를 추적 할 수 있습니다. –

+0

나는 그리드에서 실행하고 그것 없이는 시도해 본다. 그것은 중요하지 않습니다. 검사는 실패로 끝납니다. 나는 Webdriver가 스레드로부터 안전하지 않기 때문에 그렇게 생각한다. 하지만 WebDriver를 안전한 스레드 또는 다른 브라우저에서 동시에 사용하는 다른 방법을 만드는 방법을 모르겠습니다. – TheX

+0

요점은 RemoteWebDriver를 사용하는 것입니다. 동일한 RemoteWebDriver를 두 번 실행하지 않으므로 스레드 안전성이 필요하지 않습니다. 동일한 Selenium Grid 2 Server에 연결되는 RemoteWebDriver의 두 인스턴스를 생성합니다. 그러면 브라우저가 처리됩니다. 좀 더 많은 코드를 보여 주면 문제가 무엇인지 이해하는 것이 더 쉬울 수 있습니다. TPL을 사용해 보셨습니까? 이렇게하면 병렬로 작업을 실행할 수있는 방법이 제공됩니다. 동일한 [Test]에서 두 개의 RemoteWebDriver 인스턴스를 만드는 방법으로 이것을 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/dd537609.aspx –

관련 문제