当 运行 并行测试时,使用 Console.SetOut 是否明智?
Is Console.SetOut wise to use when running tests in parallel?
我想测试控制台应用程序,按照此处所述重定向 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 可能会在另一个测试中途更改重定向吗?这不会扰乱测试吗?
就像你暗示的那样,你问题的答案是测试会相互干扰。
粗略地说,要在每个线程的基础上重定向控制台只需要一个包装器 class。您将需要:
- 标记为
[ThreadLocal]
的静态字段,用于跟踪每个线程上当前测试的流。
- 一个
SetOut
方法,可能是静态的,很像全局(静态)Console.SetOut
方法,它允许每个测试在测试设置期间设置上述字段。
- 流虚拟方法的实现,它读取线程本地字段并将输出转发给它。
- 此包装器的一个实例,传递给
Console.SetOut
。
我想测试控制台应用程序,按照此处所述重定向 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 可能会在另一个测试中途更改重定向吗?这不会扰乱测试吗?
就像你暗示的那样,你问题的答案是测试会相互干扰。
粗略地说,要在每个线程的基础上重定向控制台只需要一个包装器 class。您将需要:
- 标记为
[ThreadLocal]
的静态字段,用于跟踪每个线程上当前测试的流。 - 一个
SetOut
方法,可能是静态的,很像全局(静态)Console.SetOut
方法,它允许每个测试在测试设置期间设置上述字段。 - 流虚拟方法的实现,它读取线程本地字段并将输出转发给它。
- 此包装器的一个实例,传递给
Console.SetOut
。