我该怎么做,才能使断言不再阻止自动化测试?

4
我们使用hudson/jenkins在几台虚拟机上自动运行C#项目的NUnit测试,这些虚拟机大多数时间都在某些服务器上无人值守地运行。测试涉及启动多个进程进行数据交换,其中之一是NUnit本身,其他进程由单元测试创建。
有时,开发人员会提交触发断言(Debug.Assert())的内容,然后弹出一个消息框询问用户该怎么做。通常情况下,这些消息框会出现在单元测试创建的“外部”进程之一中。它们将阻止该进程,而其他进程则放弃,因为它们无法进行通信。但是,由于系统的性质,只要该进程被阻塞等待某个人点击消息框,下一个测试也都会失败。
我被告知可以更改.NET程序的设置,以便断言不会弹出消息框。理想情况下,该进程应仅向标准输出或标准错误写入内容,供Jenkins记录。
那么,我需要怎么做才能关闭这些交互式断言对话框呢?
2个回答

6

您需要实现System.Diagnostics.TraceListener,以便在Fail时不弹出对话框(即可以向单元测试框架报告错误),并通过使用Listeners.Clear/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.Fail)。请注意,在测试的拆卸方法中应考虑恢复原始侦听器。


-2

不要测试库的Debug版本。你想知道在客户机器上运行时会出现什么问题,那就是Release版本。自动解决你的问题。


我们两个都测试。测试Debug版本是为了在某些情况下获得详细的诊断信息。测试Release版本是为了在真实条件下进行测试。 - sbi
你在单元测试的Debug版本和Release版本中进行不同的测试?为什么要这样做? - Hans Passant
1
你选用了一种不寻常的方法。但只要DEBUG被定义,你就必须使用Assert。你唯一可行的选择是删除默认跟踪侦听器,这样就没有人会抱怨了。DefaultTraceListener的文档展示了如何通过.config文件来实现此操作。你也可以在代码中执行它。 - Hans Passant
你是故意想要误解我吗?为什么你不能_先阅读我的问题_(它谈论的是单元测试),然后再回答呢?你为什么不明白我们_希望_这些断言被触发?我们对这些测试失败并没有问题。我们唯一的问题是它会导致所有其他测试也失败了。运行多个配置的单元测试有什么不寻常的地方吗?为什么你没有回答我对你批评的任何一个观点,而是继续提出其他批评,而且还没有努力去理解问题,再次失败了吗? - sbi
@Hans:我现在有的是你说我们的方法会是“不寻常的”,但我不知道为什么,我还注意到你再次回避了我的问题。 - sbi
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接