2012-01-19 4 views
2

단일 테스트 케이스를 구성하는 일련의 CodedUI 테스트 메소드가 있습니다. 테스트 방법은 순서대로 실행해야합니다 (IE testmethoda는 testmethodb를 실행 한 다음 testmethodc를 실행 함). 결과가 Microsoft Test Manager에서 testmethoda가 통과 된 것처럼 보이기를 원합니다. testmethodb가 성공하고 testmethodc가 실패했습니다. 전체 테스트 케이스를 여러 번 반복 실행하면서이 작업을 수행 할 수있는 방법이 있습니까?테스트 관리자에서 코딩 된 UI 테스트 및 결과를 주문하십시오.

나는 하나의 테스트 메소드에 테스트 메소드를 넣고 호출하려고 시도했다. 이렇게하면 원하는 테스트 순서와 여러 테스트 실행 기능을 얻을 수 있지만 테스트 관리자는 전체 테스트 사례에 대해 단일 통과/실패를 표시합니다.

나는 또한 개별 테스트 메소드에 데이터 소스를 첨부하고 테스트 매니저에서 원하는 테스트 결과를 제공하는 테스트 매니저에서 주문을 시도했지만, 둘 이상의 데이터 행을 실행하려는 경우 부작용이있다. 엉망이된다. 예를 들어 3 개 데이터 행이 실행됩니다 :

testmethoda
testmethoda
testmethoda

testmethodb
testmethodb
testmethodb

testmethodc
testmethodc
testmethodc

내가 w 실행하도록 개미 :
testmethoda
testmethodb
testmeothdc

testmethoda
testmethodb
testmethodc 등

나뿐만 아니라 순서 테스트를 사용하는 방법에 대한 생각하지만 여전히 단일로 나타 MTM에서 테스트하고 데이터 이동에 대해 알고있는 방법이 없기 때문에 문제가 발생합니다.

이러한 결과를 얻으려면 VS 또는 MTM에없는 기능이 있습니까? 아마도 결과 파일에서 테스트 실행을 정의 할 수있는 방법일까요? trx 파일을 작성/편집하면 내 결과가 MTM에 반영됩니까? 옵션이 아닌 TFS 데이터베이스를 변경해야한다는 느낌이 들었습니다.

답변

0

VS 또는 MTM을 통해이를 수행 할 방법이 없다고 생각합니다. 하나의 테스트 메소드를 모두 추가하는 옵션은 좋은 일이지만, 그 중 하나가 실패하면 '부모'테스트 메소드가 중지되고 내부 테스트 중 하나가 발생시킨 'AssertFailedException'을 발생시킵니다.

그러나 테스트 방법 (a, b, c ...)이 인 경우 완전히이 영향을받지 않습니다 (즉, testMethodA가 실패하면 다른 테스트가 문제없이 실행될 수 있음을 의미 함). 모든 내부 예외를 포착하고 마지막에 메서드가 전달 된 메서드와 그렇지 않은 메서드를 출력합니다.

[TestClass] 
public class TestClass 
{ 
    Dictionary<string, string> testMethods; 
    bool testResult; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     testMethods = new Dictionary<string, string>(); 
     testResult = true; 
    } 

    [TestMethod] 
    public void TestMethod() 
    { 
     //Run TestMethodA 
     try 
     { 
      TestMethodA(); 
      testMethods.Add("TestMethodA", "Passed"); 
     } 
     catch (AssertFailedException exception) //Edit: better catch a generic Exception because CodedUI tests often fail when searcing for UI Controls 
     { 
      testResult = false; 
      testMethods.Add("TestMethodA", "Failed: " + exception.Message); 
     } 

     //Run TestMethodB 
     try 
     { 
      TestMethodB(); 
      testMethods.Add("TestMethodB", "Passed"); 
     } 
     catch (AssertFailedException exception) 
     { 
      testResult = false; 
      testMethods.Add("TestMethodB", "Failed: " + exception.Message); 
     } 
    } 

    [TestCleanup] 
    public void TestCleanup() 
    { 
     foreach (KeyValuePair<string, string> testMethod in testMethods) 
     { 
      //Print the result for each test method 
      TestContext.WriteLine(testMethod.Key.ToString() + " --> " + testMethod.Value.ToString()); 
     } 

     //Assert if the parent test was passed or not. 
     Assert.IsTrue(testResult, "One or more inner tests were failed."); 
    } 
} 

이러한 모든 'try-catch'를 피하기 위해 모든 동작을 관리하는 다른 클래스를 만들 수도 있습니다.

+0

예, 불행히도 A B와 C는 서로 영향을줍니다. A가 실패한 경우 B와 C는 실행할 수 없으므로 결정적으로 종료해야합니다.진짜 문제는 A B와 C가 모두 하나의 테스트 케이스로 간주되어야한다는 것입니다. – stoj

+0

테스트 방법은 하나의 테스트 케이스이지만 나중에 다른 테스트 케이스에서 재사용 할 수 있도록 작은 메소드에서 벗어나는 것이 좋습니다. 예를 들어, A 메소드가 'LoginToSite()'인 경우 여러 테스트 케이스가 사용되므로 로그인 페이지의 변경 사항 중 하나의 메소드 만 변경 (또는 다시 기록)하면됩니다. 내 답변에 관해서는 웹 서비스에 대한 간단한 호출이 많은 데이터베이스 어설 션을 수행하고 다른 응용 프로그램에 대한 많은 호출을 기대하는 '블랙 박스'테스트에서 사용합니다. 따라서 데이터베이스 어설 션이나 예상 호출 중 하나라도 실패하면 시험은 멈추지 않을 것이다. – Schaliasos

+0

그래, 개발 관점에서 그들은 분리해야한다. 그렇지 않으면 DRY를 위반하는 언급은 말할 것도없고 unmaintable 500 라인 함수가 될 것이다 .... 테스트 케이스보고 관점에서 나는 그들이 단일 케이스라고 생각한다. – stoj

관련 문제