什么是从多个线程进行单元测试的最佳方法?

时间:2008-09-03 12:39:53

标签: c# multithreading unit-testing testing

这是从我的另一个question开始的。

基本上,一旦我有了访问该文件的代码(将在一分钟内查看答案),测试的最佳方式是什么?

我正在考虑创建一个方法,它只生成大量的BackgroundWorker或者什么,并告诉他们所有加载/保存文件,并测试不同的文件/对象大小。然后,从线程中获取响应以查看它是否失败/成功/使世界崩溃等。

你们能提出任何关于最佳方法的建议吗?正如我之前所说,这对我来说有点新鲜:)

修改

关注ajmastrean's帖子:

我正在使用控制台应用程序来测试Debug.Asserts:)


更新

我最初使用BackgroundWorker来处理线程(因为我已经习惯了来自Windows开发)我很快意识到当我执行测试时需要在继续之前完成多个操作(线程),我意识到要做到这一点会有点骇人听闻。

然后我在ajmastrean的帖子上跟进并意识到我应该使用Thread类来处理并发操作。我现在将使用这种方法进行重构(虽然是一种不同的方法)。

3 个答案:

答案 0 :(得分:13)

在.NET中,ThreadPool线程不会在未设置ManualResetEventAutoResetEvent的情况下返回。我发现这些过度杀伤是一种快速的测试方法(更不用说创建,设置和管理的复杂程度)。后台工作者对回调等也有点复杂。

我发现有效的作品

  1. 创建一个线程数组。
  2. 设置每个主题的ThreadStart方法。
  3. 启动每个帖子。
  4. 加入所有线程(阻止当前线程,直到所有其他线程完成或中止)
  5. public static void MultiThreadedTest()
    {
        Thread[] threads = new Thread[count];
    
        for (int i = 0; i < threads.Length; i++)
        {
            threads[i] = new Thread(DoSomeWork());
        }
    
        foreach(Thread thread in threads)
        {
            thread.Start();
        }
    
        foreach(Thread thread in threads)
        {
            thread.Join();
        }
    }
    

答案 1 :(得分:1)

@ajmastrean,因为单元测试结果必须是可预测的,我们需要以某种方式同步线程。如果不使用事件,我就看不到一种简单的方法。

我发现ThreadPool.QueueUserWorkItem为我提供了一种测试此类用例的简便方法

 ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open);
    event1.Set(); // Start 2nd tread;
    event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => { 
    try
    {
        event1.WaitOne(); // Waiting until 1st thread open file
        File.Delete(fileName); // Simulating conflict
    }
    catch (IOException e)
    {
        Debug.Write("File access denied");
    }
});

答案 2 :(得分:-2)

你的想法应该可以正常工作。基本上你只想生成一堆线程,并确保编写文件的人花费足够长的时间来实际让读者等待。如果所有线程都没有错误地返回,并且没有永久阻塞,则测试成功。