MbUnit Icarus在这次测试中自我毁灭

时间:2011-04-11 23:29:16

标签: multithreading unit-testing mbunit gallio icarus

我正在尝试使用MbUnit测试多线程IO类。我的目标是让测试夹具构造函数执行3次,对于类中的每一行执行一次。然后,对于每个实例,在并行线程上多次执行测试。

但是,Icarus在TaskRunner上爆发了'索引超出范围'。我无法获得完整的堆栈,它会过快地生成消息框。

我做错了什么,或者这是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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我不会回答关于bug的直接问题,但我认为以下步骤将有助于找到错误并且不会在弹出消息框中丢失

  • 减少总文件数量,        子文件夹的值要低得多        看看2或甚至1中是否仍然存在错误        文件计数

    • 您的测试代码不是    超级容易,应该是, 为测试编写测试    所以你知道他们在跑步    正确的,也许那些随机的nexts    是问题,也许是一些问题    否则,测试应该很容易。

    • 弄清楚测试打破了什么    系统,你的代码包含3个测试,    和构造函数,另外评论两个    测试并查看哪一个产生    错误

    • 您的线程重复150    看起来病得很重,也许会尝试更小    错误是基本的,如2或3的数字    如果你,甚至2个线程可能会破坏    运行150个线程,我可以理解    麻烦的消息框

    • 添加日志记录并尝试catch - catch    索引异常并记录你的    班级国家认真,后    检查它我想你会看到    问题要清楚得多。

现在你无法弄清楚我认为的问题,你有太多的变量,更不用说你没有提供你的Cache类的代码,它可能包含导致它的一些简单错误,之后MBunit功能甚至开始出现