2012-05-23 4 views
6

Mam bibliotekę klasy nunitów zawierającą przypadki testowe. Chcę programowo uzyskać listę wszystkich testów w bibliotece, głównie nazwy testowe i ich identyfikatory testowe. Oto co mam do tej pory:Pobierz programowo listę bibliotek w bibliotece nunit bez konieczności wykonywania testów.

var runner = new NUnit.Core.RemoteTestRunner(); 
runner.Load(new NUnit.Core.TestPackage(Request.PhysicalApplicationPath + "bin\\SystemTest.dll")); 
var tests = new List<NUnit.Core.TestResult>(); 
foreach (NUnit.Core.TestResult result in runner.TestResult.Results) 
{ 
    tests.Add(result); 
} 

Problem jest, że runner.TestResult jest null, dopóki faktycznie uruchomić testy. Oczywiście nie chcę przeprowadzać testów w tym momencie, chcę tylko uzyskać listę testów w bibliotece. Następnie dam użytkownikom możliwość wyboru testu i uruchomienia go indywidualnie, przekazując identyfikator testu do instancji RemoteTestRunner.

Jak mogę uzyskać listę testów bez faktycznego uruchomienia wszystkich?

Odpowiedz

6

Można użyć odbicia, aby załadować zespół i wyszukać wszystkie atrybuty test. To da ci wszystkie metody, które są metodami testowymi. Reszta należy do ciebie.

Oto przykład na msdn na temat używania odbicia, aby uzyskać atrybuty dla typu. http://msdn.microsoft.com/en-us/library/z919e8tw.aspx

+1

+1, jednak nie jest twist: z TestCaseAttribute można parametrize metody badawczej, a więc przekształcenie go w wielu testach (logicznych). Nic, z czym nie można poradzić sobie poprzez refleksję, ale coś, o czym trzeba pamiętać. –

+0

@ Christian.K Dobra uwaga, aby OP miał na uwadze. –

+0

Myślałem o zrobieniu tego pierwotnie, ponieważ dałoby mi to nazwy testowe (funkcja), jednak nie dałoby mi to identyfikatorów testowych. Dopóki mogę wykonać test RemoteTestRunner przefiltrowany przez nazwę testu zamiast identyfikatora testu, to powinno działać poprawnie, sprawdzi to. – Justin

4

Oto kod, aby pobrać wszystkie nazwy testów z zespołem klasy biblioteki testu:

//load assembly. 
      var assembly = Assembly.LoadFile(Request.PhysicalApplicationPath + "bin\\SystemTest.dll"); 
      //get testfixture classes in assembly. 
      var testTypes = from t in assembly.GetTypes() 
       let attributes = t.GetCustomAttributes(typeof(NUnit.Framework.TestFixtureAttribute), true) 
       where attributes != null && attributes.Length > 0 
       orderby t.Name 
        select t; 
      foreach (var type in testTypes) 
      { 
       //get test method in class. 
       var testMethods = from m in type.GetMethods() 
            let attributes = m.GetCustomAttributes(typeof(NUnit.Framework.TestAttribute), true) 
        where attributes != null && attributes.Length > 0 
        orderby m.Name 
        select m; 
       foreach (var method in testMethods) 
       { 
        tests.Add(method.Name); 
       } 
      } 
1

Odpowiedź przez Justin nie działa dla mnie. Dodaje się robi (pobiera wszystkie nazwy metod z atrybutem Test):

Assembly assembly = Assembly.LoadFrom("pathToDLL"); 
foreach (Type type in assembly.GetTypes()) 
{ 
    foreach (MethodInfo methodInfo in type.GetMethods()) 
    { 
     var attributes = methodInfo.GetCustomAttributes(true); 
     foreach (var attr in attributes) 
     { 
      if (attr.ToString() == "NUnit.Framework.TestAttribute") 
      { 
       var methodName = methodInfo.Name; 
       // Do stuff. 
      } 
     } 
    } 
} 
+0

To działa. Jeśli chcesz uzyskać liczbę testów w bieżącej uruchomionej klasie testowej, nie jest to cała dll, dodaj następujący kod: if (TestContext.CurrentContext.Test.ClassName.Contains (type.Name)) {... –

Powiązane problemy