2012-01-19 6 views
2

私は一連のCodedUIテストメソッドを用意しています。テストメソッドは順番に実行する必要があります(IE testmethodaは次にtestmethodbを実行してからtestmethodcを実行します)、結果はtestmethodaが渡された、testmethodbが渡された、testmethodcが失敗したように見えるようにMicrosoft Test Managerに表示します。全体的なテストケースの複数の反復を実行できる一方、これを行う方法はありますか?コード化されたUIテストと結果をTest Managerで注文する

私は、テストメソッドを単一のテストメソッドに入れて呼び出すことを試みました。これにより、希望のテスト順序と複数のテスト実行を行うことができますが、テストマネージャはテストケース全体で単一の合否を示します。

また、個々のテストメソッドにデータソースを添付し、テストマネージャでそれらを注文すると、テストマネージャで希望のテスト結果が得られますが、複数のデータ行を実行する場合は、うんざりする例えば、3つのデータ行を実行します:

testmethoda
testmethoda
testmethoda

testmethodb
testmethodb
testmethodb

testmethodc
testmethodc
testmethodc

私はワット実行するようにアリ:
testmethoda
testmethodb
testmeothdc

testmethoda
testmethodb
testmethodcなど。

私も注文したテストを使用してについて考えているが、それはまだシングルとして現れますMTMでテストしてみて、私がデータに気付いている方法はないと思います。

これらの結果を得るために、VSまたはMTMに欠けている機能がありますか?おそらく、私が結果ファイルでテストランを定義できる方法でしょうか? trxファイルを作成/編集すると結果がMTMに反映されますか?私はオプションではないTFSデータベースに変更を加えなければならないと感じています。

答えて

0

VSやMTMでこれを行う方法はないと思います。すべてのテストメソッドを単一のものに追加するという選択肢がありますが、そのうちの1つが失敗すると、「親」テストメソッドが停止し、内部テストの1つがスローした「AssertFailedException」がスローされます。

完全にの場合(これは、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をすべて1つのテストケースとみなすことです。 – stoj

+0

あなたのテストメソッドは1つのテストケースですが、小さなメソッドでそれらを分割して後で他のテストケースでそれらを再利用できるようにするのは非常に良い方法です。たとえば、Aメソッドが 'LoginToSite()'の場合は、複数のテストケースが使用されていると思われますので、ログインページの変更は1つのメソッドを変更(または再記録)するだけです。私の答えは、Webサービスへの単純な呼び出しで多くのデータベースアサーションが実行され、他のアプリケーションへの呼び出しが多くなるという「ブラックボックス」テストで使用しています。したがって、データベースアサーションや期待される呼び出しのいずれかが失敗した場合テストは止まらない。 – Schaliasos

+0

そうですね、開発の観点からは分離しなければなりません。そうでなければ、DRYに違反しているとは言いがたい500行の機能はありません。テストケースの報告の観点からは、 – stoj

関連する問題