Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行运行测试时使用Console.SetOut明智吗?_C#_Unit Testing_Thread Safety - Fatal编程技术网

C# 并行运行测试时使用Console.SetOut明智吗?

C# 并行运行测试时使用Console.SetOut明智吗?,c#,unit-testing,thread-safety,C#,Unit Testing,Thread Safety,我想测试一个控制台应用程序,重定向std out和std in,如下所述: 代码如下: private StringWriter _sw; private StringReader _sr; [SetUp] public void SetUp() { _sw = new StringWriter(); Console.SetOut(_sw); _sr = new StringReader("100"); Console.SetIn(_sr); } [TearDo

我想测试一个控制台应用程序,重定向std out和std in,如下所述:

代码如下:

private StringWriter _sw;
private StringReader _sr;
[SetUp]
public void SetUp()
{
    _sw = new StringWriter();
    Console.SetOut(_sw);
    _sr = new StringReader("100");
    Console.SetIn(_sr);
}

[TearDown]
public void TearDown()
{
    var standardOut = new StreamWriter(Console.OpenStandardOutput());
    standardOut.AutoFlush = true;
    Console.SetOut(standardOut);
    Console.SetIn(new StreamReader(Console.OpenStandardInput()));
 }
在每个测试中,我将运行对控制台的读写代码

从上面的代码中可以看出,每个测试将从以下内容开始:

  _sw = new StringWriter();
  Console.SetOut(_sw);
如果多个测试并行运行,这些测试会相互冲突吗


从一个测试调用Console.SetOut是否可能会在另一个测试的中途更改重定向?这不会干扰测试吗?

正如您所暗示的,您的问题的答案是测试会相互干扰。

因此,粗略地说,在每个线程的基础上重定向控制台只需要一个包装类。您将需要:

  • 一个静态字段,标记为
    [ThreadLocal]
    ,用于跟踪每个线程上当前测试的流
  • 一种
    放样
    方法,可能是静态的,很像全局(静态)
    控制台。放样
    方法,允许每个测试在测试设置期间设置上述字段
  • 流虚拟方法的一种实现,它读取线程本地字段并将输出转发给它
  • 此包装的一个实例,传递给
    控制台。SetOut

  • “线程安全”一词在本次讨论中没有用处。例如,单个
    Console.WriteLine
    调用将输出发送到原始流或新流的定义(不能同时发送两个流)对于并行单元测试并不特别有用。为此,您需要一个线程本地输出流。您是否可以提供一个使用线程本地输出流的示例?如果没有解释就得到一个-1,这总是令人沮丧的。虽然我不是下一个投票人,但我认为您的问题可以更具建设性地表述。你正在尝试做一些事情:问问这个问题——不要问某个特定的方法是否“明智”。在这里,您似乎想知道在使用并行测试时如何重定向控制台输出——如果可能的话。到目前为止,你仍然可以(也应该)在问题中包含你的推理,但不要将其作为问题的核心。顺便问一句,这是一个有趣的问题(如果我可以问的话——你为什么想要这个?)