代码之家  ›  专栏  ›  技术社区  ›  Rob Cooper

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

  •  16
  • Rob Cooper  · 技术社区  · 16 年前

    这是从另一个 question 我的。

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

    我正在考虑创造一种方法,它能产生很多 BackgroundWorker 或者别的什么,告诉他们所有加载/保存文件,并用不同的文件/对象大小进行测试。然后,从线程中得到一个响应,看看它是否失败/成功/导致了世界内爆等。

    你们能就解决这个问题的最佳方法提出什么建议吗?正如我之前所说,这对我来说都是新的。)

    编辑

    跟随 ajmastrean's 职位:

    我正在使用控制台应用程序测试debug.assets:)


    更新

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

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

    3 回复  |  直到 9 年前
        1
  •  13
  •   Daniel Ballinger    10 年前

    在.NET中, ThreadPool 没有设置线程将无法返回 ManualResetEvent S或 AutoResetEvent 我发现这些对快速测试方法来说是多余的(更不用说创建、设置和管理的复杂性)。后台工作人员也有点复杂,有回调等等。

    我发现它的作用是

    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();
        }
    }
    
        2
  •  1
  •   aku    16 年前

    @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
  •  -2
  •   Eric Z Beard    16 年前

    你的想法应该行得通。基本上,您只需要生成一组线程,并确保编写文件的线程花费足够长的时间来真正让读者等待。如果您的所有线程返回时都没有错误,并且永远没有阻塞,那么测试就成功了。