2016-09-16 16 views
5

Mam zestaw testów w menedżerze testów firmy Microsoft. Każdy test jest mapowany na określony identyfikator WorkItem. Chcę uruchomić wszystkie testy mające identyczny identyfikator workitem jako playlistę. Poniżej znajduje się przykładowy test próbki.Utwórz listę metod testowych mających ten sam identyfikator workitem w przeglądarce testowej Microsoft

[TestMethod] 
     [TestCategory("Cat A")] 
     [Priority(1)] 
     [WorkItem(5555)] 
     public void SampleTest() 
     { 
      Do some thing 
     } 

Próbowałem, ale nie udało mi się utworzyć listy odtwarzania według Workitem id. Proszę zasugerować, czy jest to możliwe.

+0

Dlaczego nie chcesz dodać kolejną kategorię do testu? Na przykład. '[TestCategory (" Cat A ")] [TestCategory (" WorkItem 5555 ")] public void SampleTest ... – Gabrielius

Odpowiedz

2

Będziesz musiał użyć odbicia.
Uzyskaj typ swojej klasy, uzyskaj jej metody, a następnie wyszukaj te, które mają poprawny atrybut (y).

MethodInfo[] methods = yourClassInstance.GetType() 
    .GetMethods()).Where(m => 
    { 
     var attr = m.GetCustomAttributes(typeof(WorkItem), false); 
     return attr.Length > 0 && ((WorkItem)attr[0]).Value == 5555; 
    }) 
    .ToArray(); 

Pamiętaj, że możesz sprawdzić wiele atrybutów, jeśli chcesz.
Następnie należy użyć tylko instancji klasy macierzystej jako celu uruchamiania tych metod.

foreach (var method in methods) 
{ 
    method.Invoke(yourClassInstance, null); 
} 

Jeśli metody mają parametry, wymienić null ze związkiem object[] zawierający parametry.

Oto pełny przykład roboczych, aby spróbować:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 

namespace ConsoleApplication7 
{ 
    public class MyAttribute : Attribute 
    { 
     public MyAttribute(int val) 
     { 
      Value = val; 
     } 

     public int Value { get; set; } 
    } 

    class Test 
    { 
     [MyAttribute(1)] 
     public void Method1() 
     { 
      Console.WriteLine("1!"); 
     } 
     [MyAttribute(2)] 
     public void Method2() 
     { 
      Console.WriteLine("2!"); 
     } 
     [MyAttribute(3)] 
     public void Method3() 
     { 
      Console.WriteLine("3!"); 
     } 
     [MyAttribute(1)] 
     public void Method4() 
     { 
      Console.WriteLine("4!"); 
     } 
    } 

    class Program 
    { 

     static void Main(string[] args) 
     { 
      var test = new Test(); 

      var types = Assembly.GetAssembly(test.GetType()).GetTypes(); 

      MethodInfo[] methods = test.GetType().GetMethods() 
       .Where(m => 
        { 
         var attr = m.GetCustomAttributes(typeof(MyAttribute), false); 
         return attr.Length > 0 && ((MyAttribute)attr[0]).Value == 1; 
        }) 
       .ToArray(); 

      foreach (var method in methods) 
      { 
       method.Invoke(test, null); 
      } 
     } 
    } 
}