2011-04-11 9 views
6

Estoy intentando probar una clase de IO de subprocesos múltiples utilizando MbUnit. Mi objetivo es hacer que el constructor del dispositivo de prueba se ejecute 3 veces, una para cada fila de la clase. Luego, para cada instancia, ejecuta las pruebas varias veces en los hilos paralelos.MbUnit Icarus se autodestruye en esta prueba

Sin embargo, Icarus explota con un 'índice fuera de rango' en TaskRunner. No puedo obtener la pila completa, genera cuadros de mensajes demasiado rápido.

¿Qué estoy haciendo mal, o es esto un error en MbUnit/Gallio?

using System; 
using System.Collections.Generic; 
using System.Text; 
using Gallio.Framework; 
using MbUnit.Framework; 
using MbUnit.Framework.ContractVerifiers; 
using System.IO; 

namespace ImageResizer.Plugins.DiskCache.Tests { 
    [TestFixture] 
    [Row(0,50,false)] 
    [Row(0,50,true)] 
    [Row(8000,100,true)] 
    public class CustomDiskCacheTest { 

     public CustomDiskCacheTest(int subfolders, int totalFiles, bool hashModifiedDate) { 
      char c = System.IO.Path.DirectorySeparatorChar; 
      string folder = System.IO.Path.GetTempPath().TrimEnd(c) + c + System.IO.Path.GetRandomFileName(); 
      cache = new CustomDiskCache(folder,subfolders,hashModifiedDate); 
      this.quantity = totalFiles; 

      for (int i = 0; i < quantity;i++){ 
       cache.GetCachedFile(i.ToString(),"test",delegate(Stream s){ 
        s.WriteByte(32); //Just one space 
       },defaultDate, 10); 
      } 
     } 
     int quantity; 
     CustomDiskCache cache = null; 
     DateTime defaultDate = new DateTime(2011, 1, 1); 

     [ThreadedRepeat(150)] 
     [Test(Order=1)] 
     public void TestAccess() { 
      CacheResult r = 
       cache.GetCachedFile(new Random().Next(0, quantity).ToString(), "test", 
       delegate(Stream s) { Assert.Fail("No files have been modified, this should not execute"); }, defaultDate, 100); 

      Assert.IsTrue(System.IO.File.Exists(r.PhysicalPath)); 
      Assert.IsTrue(r.Result == CacheQueryResult.Hit); 
     } 

     volatile int seed = 0; 
     [Test (Order=2)] 
     [ThreadedRepeat(20)] 
     public void TestUpdate() { 
      //try to get a unique date time value 
      DateTime newTime = DateTime.UtcNow.AddDays(seed++); 
      CacheResult r = 
       cache.GetCachedFile(new Random().Next(0, quantity).ToString(), "test", 
       delegate(Stream s) { 
        s.WriteByte(32); //Just one space 
       }, newTime, 100); 

      Assert.AreEqual<DateTime>(newTime, System.IO.File.GetLastWriteTimeUtc(r.PhysicalPath)); 
      Assert.IsTrue(r.Result == CacheQueryResult.Miss); 
     } 


     [Test(Order=3)] 
     public void TestClear() { 
      System.IO.Directory.Delete(cache.PhysicalCachePath, true); 
     } 
    } 
} 

Respuesta

1

no voy a responder a la pregunta directa acerca de errores pero pienso siguientes pasos le ayudarán a encontrar el error y no se pierden en los cuadros de mensajes que hacen estallar

  • números de disminución de TotalFiles, subcarpetas a valores mucho más bajos a ver si el error persiste en 2 o incluso 1 archivo cuenta

    • sus pruebas de c oda no es muy fácil, como debe ser, pruebas de escritura para pruebas por lo que saben que se están ejecutando correcta, tal vez esas nexts azar son el problema, tal vez algo otra cosa, las pruebas deben ser fáciles.

    • averiguar qué prueba se rompe el sistema , el código contiene 3 pruebas, y constructor, comentan dos otros pruebas y ver cuál produce error

    • su repetición roscado 150 se ve muy enfermo, quizás tratar un número menor como 2 o 3 si el error es básico incluso 2 hilos podrían romperse, si usted de ejecución de 150 hilos puedo entender su problema con cuadros de mensaje

    • agregar el registro y tratar de atrapar - atrapar esa excepción de índice y registrar su estado de clase cuidadosamente, después de inspeccionarlo creo que verá problema mucho más claro.

En este momento usted no puede averiguar el problema creo, tienes demasiadas variables, por no hablar de que aún no ha proporcionar el código para su clase de caché que podría contener algún error simple que está causando, antes Las funciones de MBunit incluso comienzan a aparecer.

Cuestiones relacionadas