Visual Studio对Windows Forms进行单元测试

12
我们正在使用Visual Studio 2008开发项目。我们正在使用内置的测试套件(Microsoft.VisualStudio.TestTools.UnitTesting命名空间)进行测试。很遗憾,我们发现大量复杂性(因此错误)已编码到我们的UI层中。虽然我们的单元测试可以很好地覆盖我们的业务层,但我们的UI层仍是一个不断引起烦恼的问题。我们最好也能对其进行单元测试。有没有人知道在Visual Studio中有哪些“与Microsoft兼容”的好方法来做到这一点?将像nUnitForms这样的单元测试框架与Microsoft的东西“混合”会引入某种冲突吗?在对表单进行单元测试时,我应该注意哪些明显的陷阱?

未找到http://nunitforms.sourceforge.net/。 - Kiquenet
8个回答

5
您需要重构UI界面,使其不需要进行单元测试。UI应该包含最少或没有业务逻辑。有许多模式可以解决这个问题。Martin Fowler有一篇非常好的文章详细介绍了这些模式:http://martinfowler.com/eaaDev/uiArchs.html 马丁·福勒(Martin Fowler)的《重构》一书中有一个小章节讲述了如何重构不可测试的UI。您也可以阅读《与遗留代码有效地工作》。
注意:有一些工具可以用于自动化UI测试,例如SilkTest。但如果可能的话,我不建议使用它们。

1
完全同意。花时间将逻辑从用户界面中分离出来,并对业务层进行单元测试。这样,您就可以将业务层插入到 Web 应用程序或 WPF 应用程序中,而不需要更改单元测试。UI 测试应该由人类进行,测试无法量化的事物(例如外观更好)。 - jcollum
5
问题在于大量UI逻辑非常关注UI本身,而不是业务逻辑。例如,“当记录变脏并且用户更改屏幕时,提示用户保存”、“确保用户在按下OK按钮时填写了所有必填数据输入字段”以及其他控件。 - GWLlosa
请查看我建议的文章中的HumbleDialog和PassiveView。这将把所有UI逻辑从Presenter中移除,使UI变得非常简单和易于测试,只需查看即可。 - StackUnderflow
8
先有鸡还是先有蛋?为了重构,需要有测试来比较重构前后的结果。因此,如果你有一个包含领域/存储库逻辑的传统用户界面,唯一的测试地点就在用户界面。 - user16324

3

这对于常规的应用程序单元测试来说都非常好......但是如果您正在构建需要测试控件行为和状态的用户控件,那么它也需要一个单元测试框架。 NUnitForms可能是您的答案——就我个人而言,我需要亲自验证一下。


2

我使用被动视图架构,具体细节可以在这里查看:http://martinfowler.com/eaaDev/PassiveScreen.html

基本上将所有代码移至表单中的一个名为xxxUI的独立类中。然后该表单实现IxxxUI接口并公开xxxUI类所需的任何内容。您可能可以简化事情,并将处理几个控件聚合到一个方法中。

流程如下:用户单击按钮。 按钮调用相应UI类上的方法,传递任何需要的参数。 UI类方法修改模型。 然后使用接口更新UI。

对于单元测试,您需要测试或虚拟类实现接口,并将自己注册到UI类中。 您可以让这些测试类触发任何类型的输入并相应地作出反应。 通常我有序列列表以精确顺序执行操作(点击A,单击此处,滚动那里,然后键入B等)。


1

1

使用ApprovalTests(www.approvaltests.com或nuget批准测试)测试Winforms非常容易,并且它们与MsTest和Nunit兼容。

这里有一个视频,介绍如何操作:https://www.youtube.com/watch?v=hKeKBjoSfJ8

但是,这个过程很简单。 1)创建您想要在所需状态下进行验证的表单。 2)调用WinFormApprovals.Verify(form)

ApprovalTests使用黄金大师范例来屏幕捕获结果。如果您喜欢它,只需将文件重命名为.approved,测试就会通过。

对于重构现有代码的好处是,您甚至不必担心结果是什么,因为您只关心您没有更改它。


0

你应该使用Microsoft Coded UI来测试UI层。这涉及编写(或录制)模仿用户执行的操作的测试,并编写断言语句以确保实现正确的输出。

当然,这可能不是单元测试,因为很难从前端创建测试单个工作单元的操作,并且不能替代其他单元测试。我也同意前端业务逻辑应尽可能简单。但是,这将填补您的单元测试未覆盖的任何空白。希望只有小的工作单元未被单元测试覆盖,以便编码UI测试可以捕获其余未经测试的单元。

Coded UI已内置于最新版本的Visual Studio Premium中。我建议您不要仅使用记录功能,而是学习如何自己编写测试,因为这会给您更大的灵活性。


0

在测试自己的UI控件方面,我使用NUnitForms取得了良好的结果!如果您正在使用标准(或经过充分测试的)UI控件,则我会同意其他人的重构建议。

如果重点是测试实际控件,我会使用NUnitForms,因为它可以扩展以支持您的新控件。无论如何,如果您不想涉及任何手动测试,您将需要一个库来执行显示的最终结果的“基于图像”的分析。

我尝试过TestComplete,但我认为它有点太贵了,因为我可以在c#中编写类似的库来进行图像比较。因此,我的计划是单独测试控件,然后按照其他人提到的方式重构UI。


0

看看Jeremy D. Miller的WIP 演示模式维基页面,获取重构灵感 :)

Miller正在写一本书,看起来这将是必备的。


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