这种继承自另一种 问题 我的。

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

我正在考虑创建一种方法,它会产生很多 后台工作者或其他东西并告诉他们所有加载/保存文件,并使用不同的文件/对象大小进行测试。然后,从线程中获取响应,看看它是否失败/成功/使世界崩溃等。

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

编辑

下列的 阿吉马斯特里安的 邮政:

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


更新

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

然后我跟进了 阿吉马斯特雷安的帖子并意识到我真的应该使用 线 用于处理并发操作的类。我现在将使用这种方法进行重构(尽管是一种不同的方法)。

有帮助吗?

解决方案

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

我发现有效的东西是

  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();
    }
}

其他提示

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

我发现 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");
    }
});

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top