我正在尝试使用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);
}
}
}
答案 0 :(得分:1)
我不会回答关于bug的直接问题,但我认为以下步骤将有助于找到错误并且不会在弹出消息框中丢失
减少总文件数量, 子文件夹的值要低得多 看看2或甚至1中是否仍然存在错误 文件计数
您的测试代码不是 超级容易,应该是, 为测试编写测试 所以你知道他们在跑步 正确的,也许那些随机的nexts 是问题,也许是一些问题 否则,测试应该很容易。
弄清楚测试打破了什么 系统,你的代码包含3个测试, 和构造函数,另外评论两个 测试并查看哪一个产生 错误
您的线程重复150 看起来病得很重,也许会尝试更小 错误是基本的,如2或3的数字 如果你,甚至2个线程可能会破坏 运行150个线程,我可以理解 麻烦的消息框
添加日志记录并尝试catch - catch 索引异常并记录你的 班级国家认真,后 检查它我想你会看到 问题要清楚得多。
现在你无法弄清楚我认为的问题,你有太多的变量,更不用说你没有提供你的Cache类的代码,它可能包含导致它的一些简单错误,之后MBunit功能甚至开始出现