C# 并行运行测试时使用Console.SetOut明智吗?
我想测试一个控制台应用程序,重定向std out和std in,如下所述: 代码如下: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
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,这总是令人沮丧的。虽然我不是下一个投票人,但我认为您的问题可以更具建设性地表述。你正在尝试做一些事情:问问这个问题——不要问某个特定的方法是否“明智”。在这里,您似乎想知道在使用并行测试时如何重定向控制台输出——如果可能的话。到目前为止,你仍然可以(也应该)在问题中包含你的推理,但不要将其作为问题的核心。顺便问一句,这是一个有趣的问题(如果我可以问的话——你为什么想要这个?)