MbUnit Icarus самоуничтожается в этом тесте - PullRequest
6 голосов
/ 12 апреля 2011

Я пытаюсь протестировать многопоточный класс ввода-вывода с помощью MbUnit.Моя цель состоит в том, чтобы конструктор тестового устройства выполнялся 3 раза, по одному для каждой строки в классе.Затем для каждого экземпляра несколько раз выполните тесты в потоках Parallell.

Тем не менее, 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 Ответ

1 голос
/ 22 мая 2011

Я не отвечу на прямой вопрос об ошибке, но я думаю, что следующие шаги помогут найти ошибку и не потеряться в появившихся окнах сообщений

  • уменьшение количества файлов, подпапки к гораздо более низким значениям посмотреть, если ошибка не исчезнет в 2 или даже 1 количество файлов

    • код вашего теста не супер просто, как и должно быть, написать тесты для тестов так что вы знаете, что они бегут правильно, может быть, эти случайные связи проблема, может быть, что-то иначе тесты должны быть простыми.

    • выяснить, какой тест ломает система, ваш код содержит 3 теста, и конструктор, комментарий два других тесты и посмотреть, какой из них производит ошибка

    • Ваш резьбовой повтор 150 выглядит довольно больным, может быть, попробовать меньше число как 2 или 3, если ошибка является основной даже 2 темы могут оборваться, если вы запустить 150 потоков я могу понять Ваша проблема с окнами сообщений

    • добавить логирование и попробовать поймать - поймать это исключение индекса и войдите государство класса тщательно, после проверяя это, я думаю, вы увидите проблема гораздо яснее.

Прямо сейчас вы не можете понять проблему, я думаю, вы получили слишком много переменных, не говоря уже о том, что вы не предоставили код для вашего класса Cache, который может содержать некоторую простую ошибку, которая его вызывает, еще до того, как начинают появляться функции MBunit .

...