Console.SetOut是否明智地在并行运行测试时使用?

时间:2015-03-28 00:14:33

标签: c# unit-testing thread-safety

我想测试一个控制台应用,将std重定向到std,如下所述:Redirecting Console.Out within test Setup and Teardown

这是代码:

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是否可能在另一次测试中途改变重定向?这不会破坏测试吗?

2 个答案:

答案 0 :(得分:3)

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

  1. 标记为[ThreadLocal]的静态字段,用于跟踪每个线程上当前测试的流。
  2. 一种SetOut方法,可能是静态的,非常类似于全局(静态)Console.SetOut方法,它允许每个测试在测试设置期间设置上述字段。
  3. 流虚拟方法的实现,它读取线程局部字段并将输出转发给它。
  4. 此包装器的一个实例,传递给Console.SetOut

答案 1 :(得分:0)

就像你暗示的那样,你的问题的答案是测试会相互干扰。