2011-04-11 13 views
6

Próbuję przetestować wielowątkową klasę IO przy użyciu MbUnit. Moim celem jest wykonanie 3-krotnego konstruktora urządzenia testowego, raz dla każdego wiersza na klasie. Następnie, dla każdej instancji, wykonaj testy wiele razy na równoległych wątkach.MbUnit Icarus autodestrukcji w tym teście

Jednak Icarus wysadza się w indeksie poza zasięgiem na TaskRunner. Nie mogę uzyskać pełnego stosu, zbyt szybko pojawia się skrzynka z wiadomościami.

Co robię źle, czy jest to błąd w 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); 
     } 
    } 
} 

Odpowiedz

1

przyzwyczajenie Odpowiadam bezpośrednie pytanie o bug ale myślę Poniższe kroki pomogą znaleźć błąd i nie zgubić się w trzaskający skrzynkach

  • spadek liczby totalfiles, podfoldery do znacznie niższych wartościach do sprawdzić, czy błąd nadal występuje w 2 lub nawet 1 plik liczy

    • swoich testach c Ode nie jest super łatwe, jak powinno być, pisać testy do testów , więc wiesz, że działają poprawne, może te losowe następnych są problemem, może coś w innym, testy powinny być łatwe.

    • dowiedzieć się, co badanie łamie System , kod zawiera 3 testy, i konstruktora, skomentować dwa inne testy i zobaczyć, który produkuje błąd

    • Twój gwintowany powtarzania 150 wygląda całkiem chory, może spróbować mniejszy liczby jak 2 lub 3, jeżeli błąd jest podstawowe nawet 2 wątków może złamać jeśli Run 150 wątków mogę zrozumieć swoje problemy z okien komunikatów

    • dodaj rejestrację i spróbuj złapać - złapać , który zindeksuje wyjątek i zarchiwizować dokładnie swój stan klasy , po tym, jak go obejrzy, myślę, że zobaczycie Państwo znacznie jaśniej problem z numerem .

Teraz ty cant dowiedzieć się problem, myślę, że masz zbyt wiele zmiennych, nie wspominając zrobił podać kod dla swojej klasie Cache, która może zawierać pewne prosty błąd, który powoduje to, zanim Funkcje MBunit nawet zaczynają się pojawiać.

Powiązane problemy