2011-04-11 13 views
6

Tôi đang cố gắng thử nghiệm một lớp IO đa luồng bằng cách sử dụng MbUnit. Mục tiêu của tôi là có constructor thử nghiệm thi hành 3 lần, một lần cho mỗi hàng trong lớp. Sau đó, đối với mỗi trường hợp, thực hiện các phép thử nhiều lần trên các chủ đề song song.MbUnit Icarus tự hủy trên thử nghiệm này

Tuy nhiên, Icarus thổi lên bằng 'chỉ số ngoài phạm vi' trên TaskRunner. Tôi không thể có được ngăn xếp đầy đủ, nó sinh ra các hộp thông báo quá nhanh.

Tôi đang làm gì sai, hoặc đây có phải là lỗi trong MbUnit/Gallio không?

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

Trả lời

1

tôi wont trả lời câu hỏi trực tiếp về lỗi nhưng tôi nghĩ rằng bước sau đây sẽ giúp tìm ra lỗi và không bị lạc trong hộp thư popping

  • số giảm TotalFiles, thư mục con để giá trị thấp hơn nhiều để xem nếu lỗi vẫn còn trong 2 hoặc thậm chí 1 tập đếm

    • xét nghiệm của bạn c ode không phải là siêu dễ dàng, vì nó phải là, viết kiểm tra cho các bài kiểm tra để bạn biết họ đang chạy chính xác, có lẽ những ngóc ngách ngẫu nhiên là vấn đề, có thể một cái gì đó khác.

    • con số ra những gì thử nghiệm phá vỡ hệ thống , mã của bạn chứa 3 bài kiểm tra, và nhà xây dựng, bình luận hai xét nghiệm khác và xem cái nào sản xuất lỗi

    • lặp lại ren của bạn 150 trông khá ốm, có thể thử số nhỏ hơn như 2 hoặc 3 nếu lỗi là cơ bản thậm chí 2 chủ đề có thể bị hỏng, nếu bạn chạy 150 chủ đề tôi có thể hiểu sự cố của bạn với hộp thư

    • thêm ghi nhật ký và thử nắm bắt ngoại lệ chỉ mục đó và đăng nhập cẩn thận trạng thái lớp của bạn, sau khi kiểm tra xem tôi nghĩ bạn sẽ thấy vấn đề rõ ràng hơn.

Ngay bây giờ bạn không thể tìm ra các vấn đề tôi nghĩ, bạn có quá nhiều biến, chưa kể đến bạn didnt cung cấp mã cho lớp bộ nhớ cache của bạn mà có thể chứa một số lỗi đơn giản đó gây ra nó, trước khi Các tính năng của MBunit thậm chí bắt đầu xuất hiện.

Các vấn đề liên quan