c# - 并行运行测试时使用 Console.SetOut 是否明智?

标签 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 是否有可能在另一测试中途更改重定向?这不会扰乱测试吗?

最佳答案

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

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

关于c# - 并行运行测试时使用 Console.SetOut 是否明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29312141/

相关文章:

unit-testing - 您如何在大型项目中构建NUnit测试?

java - 对于写入固定大小数组的不同部分的并行线程,是否存在线程安全的 Java 数据结构?

C# 和 bool 的线程安全

c# - 绑定(bind)动态资源

c# - 如何删除字符串中的空格和换行符

c# - 如何打开测试项目代码文件夹中的文件? (Visual Studio 2008 和 .NET C#)

java - 多线程异常处理释放资源

c# - 如何在 WPF 中使用鼠标在 ViewPort3D 中旋转相机?

c# - Visual Studio 2010 + resharper 括号缩进问题

scala - 在所有测试运行之前仅初始化一次值