我必须做些什么才能使断言不再阻止自动测试?

What do I have to do so that assertions won't block automated tests anymore?

提问人:sbi 提问时间:4/1/2011 最后编辑:sbi 更新时间:4/1/2011 访问量:570

问:

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

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

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

那么,我必须做些什么来关闭这些交互式断言对话框呢?

C# Hudson 自动测试 Jenkins

评论


答:

6赞 Alexei Levenkov 4/1/2011 #1

您需要实现 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 的拆解方法中恢复原始侦听器。

-2赞 Hans Passant 4/1/2011 #2

不要测试库的调试版本。你想知道在客户的计算机上运行时失败的原因,这将是发布版本。使用断言自动解决您的问题。

评论

0赞 sbi 4/1/2011
我们两者都进行了测试。测试调试版本是为了在出现问题时获得广泛的诊断。测试发布版本是为了在真实条件下进行测试。
0赞 Hans Passant 4/1/2011
我想指出这是没有意义的对我来说是没有意义的。这些“广泛的诊断”属于单元测试。
0赞 sbi 4/1/2011
呃,我说的是单元测试。你在谈论什么?
0赞 Hans Passant 4/1/2011
呃,您在单元测试的调试与发布版本中执行不同的测试?你为什么要这样做?
1赞 Hans Passant 4/1/2011
好吧,你有一个不寻常的方法。但是,只要定义了 DEBUG,您就会坚持 Assert 处于活动状态。唯一实用的选项是删除默认的跟踪侦听器,这样就没有人可以抱怨了。DefaultTraceListener 的文档演示如何使用 .config 文件执行此操作。您也可以在代码中执行此操作。