2012-05-23 17 views
6

Tengo una biblioteca de clase nunit que contiene casos de prueba. Deseo obtener programáticamente una lista de todas las pruebas en la biblioteca, principalmente los nombres de prueba y sus identificadores de prueba. Aquí es lo que tengo hasta ahora:Obtenga la lista de pruebas en la biblioteca nunit programáticamente sin tener que ejecutar las pruebas

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); 
} 

La cuestión es que runner.TestResult es nulo hasta que realmente ejecuta las pruebas. Obviamente no quiero ejecutar las pruebas en este momento, solo quiero obtener una lista de las pruebas que están en la biblioteca. Después de eso, daré a los usuarios la posibilidad de seleccionar una prueba y ejecutarla individualmente, pasando la identificación de la prueba a la instancia de RemoteTestRunner.

Entonces, ¿cómo puedo obtener la lista de pruebas sin ejecutarlas todas?

Respuesta

6

Puede usar el reflejo para cargar el conjunto y buscar todos los atributos test. Esto le daría todos los métodos que son métodos de prueba. El resto depende de usted.

Aquí hay un ejemplo en msdn sobre el uso de la reflexión para obtener los atributos de un tipo. http://msdn.microsoft.com/en-us/library/z919e8tw.aspx

+1

+1, sin embargo hay un giro: la TestCaseAttribute se puede parametrizar un método de ensayo, convirtiéndola así en múltiples pruebas (lógicas). Nada que no pueda ser manejado por la reflexión, pero algo a tener en cuenta. –

+0

@ Christian.K Buen punto, para que el OP tenga en cuenta. –

+0

Estaba pensando en hacer esto originalmente, ya que me daría los nombres de prueba (función), sin embargo, no me daría los ID de prueba. Siempre que pueda hacer una ejecución RemoteTestRunner filtrada por el nombre de la prueba en lugar de la identificación de la prueba, entonces esto debería funcionar bien, lo verificará. – Justin

4

Este es el código para recuperar todos los nombres de las pruebas del conjunto de la biblioteca de clases de pruebas:

//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

La respuesta de Justin no funciona para mí. A continuación se hace (recupera todos los nombres de los métodos con un atributo 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

Esto funciona. Si desea obtener el recuento de las pruebas en su clase de prueba actual en lugar de la dll completa, agregue el siguiente código: if (TestContext.CurrentContext.Test.ClassName.Contains (type.Name)) {... –

Cuestiones relacionadas