提问人:sbi 提问时间:4/1/2011 最后编辑:sbi 更新时间:4/1/2011 访问量:570
我必须做些什么才能使断言不再阻止自动测试?
What do I have to do so that assertions won't block automated tests anymore?
问:
我们在几个虚拟机上使用 hudson/jenkins 对 C# 项目运行自动化 NUnit 测试,这些虚拟机在一些服务器上几乎无人值守地运行。测试涉及启动多个交换数据的进程,其中一个是 NUnit 本身,其他进程由单元测试创建。
有时,其中一位开发人员签入触发断言 () 的内容。然后会弹出一个消息框,询问用户该怎么做。通常,这些发生在单元测试创建的“外部”进程之一中。它们将阻止该进程,而其他进程则放弃,因为它们无法通信。但是,由于系统的性质,只要阻止一个进程等待某人单击该消息框,接下来的测试也将全部失败。Debug.Assert()
有人告诉我,您可以更改 .NET 程序的设置,以便断言不会弹出消息框。理想情况下,该过程只会将一些内容写入 stdout 或 stderr,供 Jenkins 记录。
那么,我必须做些什么来关闭这些交互式断言对话框呢?
答:
您需要实现 System.Diagnostics.TraceListener,该侦听器不会在失败时弹出对话框(即,您可以向单元测试框架报告错误),并使用 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)。请注意,您应该考虑在 test 的拆解方法中恢复原始侦听器。
不要测试库的调试版本。你想知道在客户的计算机上运行时失败的原因,这将是发布版本。使用断言自动解决您的问题。
评论
下一个:概括需要处理不同数据成员的算法
评论