C# 我该怎么做才能让断言获胜;你不再阻止自动测试了吗?

C# 我该怎么做才能让断言获胜;你不再阻止自动测试了吗?,c#,hudson,automated-tests,jenkins,C#,Hudson,Automated Tests,Jenkins,我们使用hudson/jenkins在几个虚拟机上对我们的C#项目运行自动化的NUnit测试,这些虚拟机在一些服务器上几乎无人值守。这些测试涉及启动几个交换数据的进程,其中一个是NUnit本身,另一个是由单元测试创建的 有时,某个开发人员签入触发断言的内容(Debug.Assert())。然后弹出一个消息框,询问用户该做什么。这些通常发生在单元测试创建的一个“外部”过程中。他们将阻止该进程,而其他进程则放弃,因为他们无法通信。但是,由于系统的性质,下一个测试也将失败,只要一个进程被阻止,等待有人

我们使用hudson/jenkins在几个虚拟机上对我们的C#项目运行自动化的NUnit测试,这些虚拟机在一些服务器上几乎无人值守。这些测试涉及启动几个交换数据的进程,其中一个是NUnit本身,另一个是由单元测试创建的

有时,某个开发人员签入触发断言的内容(
Debug.Assert()
)。然后弹出一个消息框,询问用户该做什么。这些通常发生在单元测试创建的一个“外部”过程中。他们将阻止该进程,而其他进程则放弃,因为他们无法通信。但是,由于系统的性质,下一个测试也将失败,只要一个进程被阻止,等待有人点击该消息框

有人告诉我,您可以更改.NET程序的设置,这样断言就不会弹出消息框。理想情况下,该过程只需将某些内容写入stdout或stderr,供Jenkins记录


那么,我要做什么才能关闭这些交互式断言对话框呢

您需要实现System.Diagnostics.TraceListener,它在失败时不会弹出对话框(即,您可以向单元测试框架报告错误),并使用侦听器添加此侦听器而不是默认侦听器。清除/add

public class MyListenerThatDoesNotShowDialogOnFail: System.Diagnostics.TraceListener
{....
    public override void Fail(string message, string detailMessage)
    {// do soemthing UnitTest friendly here
    }

}

System.Diagnostics.Debug.Listeners.Clear();
System.Diagnostics.Debug.Listeners.Add(new MyListenerThatDoesNotShowDialogOnFail());

此代码应该在单元测试设置部分中。这样,常规调试构建将显示assert对话框,但在运行单元测试时,它将对测试执行一些合理的操作(如assert.Fail)。注意,您应该考虑在测试的拆卸方法中恢复原始侦听器。

不要测试库的调试版本。您想知道当它在客户的机器上运行时会出现什么故障,这将是发布版本。自动解决您的断言问题。

我们对这两种方法都进行了测试。测试调试版本是为了在发生故障时获得广泛的诊断。测试发布版本是为了在真实条件下进行测试。我想我指出这是毫无意义的。这些“广泛的诊断”属于单元测试。呃,我说的是单元测试。你在说什么?呃,你在单元测试的调试版本和发布版本中做了不同的测试?你为什么要这么做?嗯,你有一个不同寻常的方法。但只要定义了DEBUG,您就必须保持Assert处于活动状态。唯一实用的选择是删除默认跟踪侦听器,这样就没有人抱怨了。DefaultTraceListener的文档向您展示了如何使用.config文件执行此操作。您也可以在代码中完成。