【问题标题】:Whats the best way to unit test from multiple threads?从多个线程进行单元测试的最佳方法是什么?
【发布时间】:2008-09-03 12:39:52
【问题描述】:

这种类型是从我的另一个question 继承而来的。

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

我正在考虑创建一种方法,它只产生大量 BackgroundWorker 或其他东西,并告诉它们全部加载/保存文件,并使用不同的文件/对象大小进行测试。然后,从线程中获取响应以查看它是否失败/成功/使世界内爆等。

你们能否就解决此问题的最佳方法提供任何建议?正如我之前所说,这对我来说有点新鲜 :)

编辑

关注ajmastrean's 发帖:

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


更新

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

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

【问题讨论】:

  • 您在使用 Visual Studio 测试工具吗?还是第三方工具,例如 NUnit 或 MbUnit?每种方法的多线程测试都有一些非常不同的模式。就此而言,您是单元测试还是只是为了测试目的而将控制台应用程序放在一起?

标签: c# multithreading unit-testing testing


【解决方案1】:

在 .NET 中,如果不设置 ManualResetEvents 或 AutoResetEvents,ThreadPool 线程将不会返回。我发现这些对于快速测试方法来说太过分了(更不用说创建、设置和管理的复杂性了)。后台工作人员在回调等方面也有点复杂。

我发现的东西是

  1. 创建线程数组。
  2. 设置每个线程的ThreadStart方法。
  3. 启动每个线程。
  4. 加入所有线程(阻塞当前线程,直到所有其他线程完成或中止)
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();
    }
}

【讨论】:

  • 接受,因为这涉及并发,这是测试的一个问题,因为主应用线程在 BackgroundWorkers 完成操作之前终止(我厌倦了添加 Thread.Sleep!)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您的想法应该可以正常工作。基本上,您只想生成一堆线程,并确保编写文件的线程需要足够长的时间才能真正让读者等待。如果你的所有线程都返回没有错误,并且没有永远阻塞,那么测试成功。

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2010-09-27
      • 2016-12-21
      相关资源
      最近更新 更多