2011-07-12 7 views
5

Hola a todos Tengo una pregunta con respecto a NUnit Extension (2.5.10). Lo que intento hacer es escribir información de prueba adicional en la base de datos . Para eso he creado la extensión NUnit utilizando el evento Listeners. El problema que estoy experimentando es que el método void TestFinished (resultado de TestResult) se está llamando dos veces en runtime. Y mi código que escribe en la base de datos está en este método y eso me deja con entradas duplicadas en la base de datos. La pregunta es: ¿Es ese el comportamiento esperado? ¿Puedo hacer algo sobre ? El código de extensión está debajo. Gracias.NUnit extensión

using System; 
using NUnit.Core; 
using NUnit.Core.Extensibility; 

namespace NuinitExtension 
{ 
[NUnitAddinAttribute(Type = ExtensionType.Core, 
        Name = "Database Addin", 
        Description = "Writes test results to the database.")] 
public class MyNunitExtension : IAddin, EventListener 
{ 
    public bool Install(IExtensionHost host) 
    { 
     IExtensionPoint listeners = host.GetExtensionPoint("EventListeners"); 
     if (listeners == null) 
      return false; 

     listeners.Install(this); 
     return true; 
    } 

    public void RunStarted(string name, int testCount){} 
    public void RunFinished(TestResult result){} 
    public void RunFinished(Exception exception){} 
    public void TestStarted(TestName testName){} 

    public void TestFinished(TestResult result) 
    { 
     // this is just sample data 
     SqlHelper.SqlConnectAndWRiteToDatabase("test", test", 
               2.0, DateTime.Now); 
    } 

    public void SuiteStarted(TestName testName){} 
    public void SuiteFinished(TestResult result){} 
    public void UnhandledException(Exception exception){} 
    public void TestOutput(TestOutput testOutput){} 
} 

}

+0

I piense que se llamará a 'TestFinished' al menos una vez por prueba. ¿Estás ejecutando solo una prueba? Si es así, es posible que se llame a 'TestFinished' una vez para el accesorio y una vez para el método de prueba. No he buscado dentro del código NUnit en mucho tiempo, así que no estoy 100% seguro. Debería poder verlo marcando las propiedades en el 'TestResult' pasado. –

+0

Gracias Mike, estoy ejecutando múltiples pruebas y quiero registrar cada prueba, pero solo una vez, en cambio, recibo dos entradas para cada prueba. Y pensé que este método en particular solo se ejecutaría por prueba una vez y SuiteStarted se ejecutaría para cada TestFixture. – Igor

+0

Las suites son diferentes. Hay una manera explícita de configurar un conjunto. Nunca lo uso, así que no estoy seguro de cómo hacerlo. 'TestResult' sigue el patrón Compuesto. Por lo tanto, podría ser el resultado de una prueba o un accesorio o la prueba completa. Me sorprende que se llame dos veces para una sola prueba. ¿Es posible que se haya instalado dos veces? –

Respuesta

1

he logrado solucionar el problema simplemente retirando mi conjunto de extensión de NUnit 2.5.10 carpeta \ bin \-2.0 netos \ complementos. Por el momento todo funciona como se esperaba, pero no estoy seguro de cómo. Pensé que tiene que tener el conjunto de extensión/complemento dentro de la carpeta de complementos. Estoy ejecutando pruebas abriendo una solución a través de NUnit.exe. Mi proyecto de extensión es parte de la solución que estoy probando. También he planteado esta cuestión con chicos NUnit y obtuvo la siguiente explicación:

Muy probablemente, su complemento se estaba cargando dos veces. Para facilitar la prueba de complementos, NUnit busca en cada ensamblaje de prueba los complementos que se cargarán, además de buscar en el directorio de complementos. Normalmente, cuando esté seguro de que su complemento funciona, debe eliminarlo del ensamblaje de prueba e instalarlo en la carpeta de complementos. Esto lo hace disponible para todas las pruebas que se ejecutan usando NUnit. OTOH, si realmente desea que el complemento se aplique a un determinado proyecto, puede dejarlo en el ensamblaje de prueba y no instalarlo como un complemento permanente. http://groups.google.com/group/nunit-discuss/browse_thread/thread/c9329129fd803cb2/47672f15e7cc05d1#47672f15e7cc05d1

0

No estoy seguro si esta respuesta es estrictamente relevante, pero podría serle útil.

estaba teniendo un juego un poco con la biblioteca para leer NUnit recientemente pruebas NUnit en lo que podría ser fácilmente transferidos a nuestro propio marco de las pruebas de aceptación en el local.

Resulta que probablemente no se pegan con esto, pero pensé que podría ser útil para compartir mis experiencias averiguar cómo utilizar el código de NUnit:

Es diferente en que no quede a cargo de la NUnit consola o Gui Runner, pero solo con nuestra propia aplicación de consola.

public class NUnitTestReader 
{ 
    private TestHarness _testHarness; 

    public void AddTestsTo(TestHarness testHarness) 
    { 
     _testHarness = testHarness; 
     var package = new TestPackage(Assembly.GetExecutingAssembly().Location){AutoBinPath = true}; 
     CoreExtensions.Host.InitializeService(); 
     var testSuiteBuilder = new TestSuiteBuilder(); 
     var suite = testSuiteBuilder.Build(package); 

     AddTestsFrom(suite); 
    } 

    private void AddTestsFrom(Test node) 
    { 
     if (!node.IsSuite) 
      AddTest(node); 
     else 
     { 
      foreach (Test test in node.Tests) 
       AddTestsFrom(test); 
     } 
    } 

    private void AddTest(Test node) 
    { 
     _testHarness.AddTest(new WrappedNUnitTest(node, TestFilter.Empty)); 
    } 
} 

Lo anterior se lee en pruebas NUnit del conjunto actual les envuelve y luego los agrega a nuestro instrumento de prueba inhouse. No he incluido estas clases pero no son realmente importantes para entender cómo funciona el código NUnit.

La información realmente útil aquí es la estática de "InitialiseService", esto tomó bastante de averiguar, pero es necesario para cargar el conjunto básico de lectores de prueba en NUnit. Debes ser un poco cuidadoso al mirar las pruebas en NUnit así como también incluye las pruebas fallidas (que supongo que no funcionan debido al número de estáticas involucradas), así que lo que parece ser documentación útil es engañoso.

Aparte de eso, puede ejecutar las pruebas implementando EventListener. Estaba interesado en obtener un mapeo uno a uno entre nuestras pruebas y las pruebas de NUnit, por lo que cada prueba se ejecuta por sí misma.Para lograr esto sólo tiene que poner en práctica TestStarted y TestFinished para hacer conexiones:

public void TestStarted(TestName testName) 
    { 

    } 
    public void TestFinished(TestResult result) 
    { 
     string text; 
     if (result.IsFailure) 
      text = "Failure"; 
     else if (result.IsError) 
      text = "Error"; 
     else 
      return; 

     using (var block = CreateLogBlock(text)) 
     { 
      LogFailureTo(block); 
      block.LogString(result.Message); 
     } 
    } 

Hay un par de problemas con este enfoque: las clases de base de prueba heredados de otros montajes con métodos de instalación que delegado a los de la actual asamblea no te llamen También tiene problemas con los métodos TestFixtureSetup que solo se invocan en NUnit cuando TestSuites se ejecutan (en lugar de ejecutar métodos de prueba por sí mismos).

Estos dos parecen ser problemas con NUnit aunque si no quieres construir pruebas envueltas individualmente Creo que sólo podría poner en una llamada a suite.Run con los parámetros adecuados y esto va a solucionar el último problema