2010-05-09 28 views
14

Me gustaría utilizar NUnit para ejecutar pruebas unitarias en mi complemento, pero debe ejecutarse en el contexto de mi aplicación. Para resolver esto, estaba tratando de desarrollar un complemento que ejecute NUnit, que a su vez ejecutará mis pruebas en el contexto de la aplicación.Cómo ejecutar NUnit desde mi código

No he encontrado una documentación específica sobre este tema, así que cavaron una pieza de información aquí y allí y salió con el siguiente fragmento de código (que es similar a uno que encontré aquí en stackoverflow):

public static void Main() 
    { 
     SimpleTestRunner runner = new SimpleTestRunner(); 
     TestPackage package = new TestPackage("Test"); 
     string loc = Assembly.GetExecutingAssembly().Location 
     package.Assemblies.Add(loc); 
     if(runner.Load(package)) 
     { 
      TestResult result = runner.Run(new NullListener()); 
     } 
    } 

La variable de resultado dice "no tiene TestFixture" aunque estoy seguro de que está allí. De hecho, mi archivo de prueba contiene dos pruebas.

El uso de otro método que he encontrado, que se resume en el siguiente código:

TestSuiteBuilder builder = new TestSuiteBuilder(); 
TestSuite testSuite = builder.Build(package); 

// Run tests 
TestResult result = testSuite.Run(new NullListener(), NUnit.Core.TestFilter.Empty); 

vi estructuras de datos NUnit con sólo 1 de prueba y que tenía el mismo error.

Para completar, estoy usando la última versión de nunit, que es 2.5.5.10112.

¿Alguien sabe lo que me estoy perdiendo? Se apreciará un código de ejemplo. Mi clase de prueba es:

[TestFixture] 
public class UnitTests 
{ 
    public UnitTests() 
    { 
    } 

    [Test] 
    public void TestEqual() 
    { 
     long a = 10; 
     long b = 10; 
     Assert.AreEqual(a, b); 
    } 

    [Test] 
    public void TestNotEqual() 
    { 
     long a = 10; 
     long b = 11; 
     Assert.AreNotEqual(a, b); 
    } 
} 
+1

Se puede construir un pequeño, pero completo programa + plugin y mostrarnos el código, que replica el problema? O, como mínimo, ¿puede publicar el archivo de clase de su complemento que está intentando probar? –

+0

¿Podría ser que su complemento esté compilado con una versión diferente de NUnit? Deduzco que no es por lo que has escrito en la pregunta, pero aun así ... haría incompatibles los tipos de atributos. –

+0

si hago Console.WriteLine (loc), imprime el nombre de la consola exe. Intenté cargar el dll de clase y obtuve "Acceso denegado". Luego, cuando hago Console.WriteLine (result.ResultState), se imprime "Inconclusive". ¿Cómo se obtiene el mensaje "no tiene textfixture"?Además, ¿cómo se comprueba que de hecho está cargando su dll de prueba? Me podría estar perdiendo algo obvio aquí. –

Respuesta

9

He publicado mi pregunta en el foro de NUnit y Charlie me dio un consejo sobre cómo encontrar el problema. Creo que podría ser una buena idea publicarlo aquí para que otros puedan evitar pasar mucho tiempo con él. La solución fue inicializar los servicios básicos primero con la siguiente línea:

CoreExtensions.Host.InitializeService(); 

gracias a todos.

1

Tuve muchos problemas con la clase SimpleTestRunner() también. Al final, cambié a la clase RemoteTestRunner() para la ejecución de pruebas unitarias mediante programación. La implementación es mucho más fácil y lo mejor de todo es que funciona.

TestPackage package = new TestPackage(@"C:\YourProject.Tests.dll"); 
RemoteTestRunner remoteTestRunner = new RemoteTestRunner(); 
remoteTestRunner.Load(package); 
TestResult result = remoteTestRunner.Run(new NullListener()); 

debe hacer referencia a los siguientes grupos:

  • nunit.core.dll
  • nunit.core.interfaces.dll

Y, por supuesto, la nunit.framework.dll debe estar en la carpeta con su aparato de pruebas.

+0

Se supone que debes pasar a remoteTestRunner. Ejecuta algún tipo de detector de eventos para capturar el resultado de las ejecuciones de casos de prueba. Todos los ejemplos que he visto en línea usan NullListener (incluido el tuyo), que no captura la salida. ¿Tiene alguna idea de cómo configurar un detector de eventos para capturar la salida? – Justin

+0

¿No es suficiente la salida de "TestResult"? ¿Que te falta? –

13

El código de abajo ayuda para resolver el problema

public static void Main() 
{ 
    CoreExtensions.Host.InitializeService(); 
    SimpleTestRunner runner = new SimpleTestRunner(); 
    TestPackage package = new TestPackage("Test"); 
    string loc = Assembly.GetExecutingAssembly().Location; 
    package.Assemblies.Add(loc); 
    if(runner.Load(package)) 
    { 
     TestResult result = runner.Run(new NullListener(), 
      TestFilter.Empty, false, LoggingThreshold.Off); 
    } 
} 
+0

Funciona para mí a partir de NUnit 2.6.3. Para diagnosticar algunos problemas al ejecutar las pruebas, también escribir los resultados puede ser útil: 'new XmlResultWriter (@" C: \ Temp \ TestResult.xml "). SaveTestResult (result)' – ceztko

+0

Cuando trato de ejecutar pruebas dentro de mi propio ensamble consigo un error al decir que nunit.core falta. He agregado los paquetes 'NUnit' y' NUnit Test Adapter' de nuget y, aunque nunit.core aparece en la lista de referencias, el código no puede encontrarlo. – Ziv

Cuestiones relacionadas