我们正在Visual Studio 2008中开展一个项目。我们正在使用它提供的内置测试套件(Microsoft.VisualStudio.TestTools.UnitTesting命名空间)。事实证明,令我们非常懊恼的是,大量的复杂性(以及错误)已经编码到我们的UI层中。虽然我们的单元测试在覆盖我们的业务层方面做得不错,但我们的UI层却是一个不断激动的来源。理想情况下,我们也希望对其进行单元测试。有没有人知道一个好的“微软兼容”的?在视觉工作室这样做的方式?它是否会与 nUnitForms “混合”单元测试框架与Microsoft的东西引入某种冲突?是否有任何明显的熊陷阱我应该注意单位测试表格?

有帮助吗?

解决方案

您需要重构UI,以便UI不需要任何单元测试。 UI应包含最少或没有业务逻辑。有许多模式可以解决这个问题。 Martin Fowler有一篇非常好的文章解释了很多这些模式: http://martinfowler.com/eaaDev/ uiArchs.html

Martin Fowler撰写的重构书中有一小章讨论了重构不可测试的UI。您还可以阅读“有效使用遗留代码”。

注意:有一些工具可用于自动化UI测试。 SilkTest出现在我的脑海里。但如果可能,我不会使用它们。

其他提示

这对于常规应用程序单元测试来说都很好...但是如果要构建需要对控件行为和状态进行单元测试的用户控件,它也需要一个单元测试框架。 NUnitForms可能是你的答案 - 我个人需要自己检查一下。

我使用Passive View架构,详见 http://martinfowler.com/eaaDev/PassiveScreen。 HTML

基本上将表单中的所有代码移动到一个名为xxxUI的单独类中。然后,该表单实现了一个IxxxUI接口,并公开了xxxUI类所需的任何内容。您可以简化操作并将多个控件聚合到一个方法中。

然后流程进入用户点击按钮。该按钮调用相应UI类上的方法。传递任何所需的参数。 UI类方法修改模型。然后使用界面更新UI。

对于单元测试,您有测试或虚拟类实现接口并使用UI类注册自己。您可以让这些测试类触发任何类型的输入并进行相应的响应。通常我有序列表,它按照精确的顺序做事。 (点击A,单击此按钮,滚动,然后键入B等)。

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

这里有一段关于如何操作的视频: https://www.youtube.com/手表?ν= hKeKBjoSfJ8

但这个过程很简单。 1)创建要在其验证状态下测试的表单。 2)调用WinFormApprovals.Verify(form)

ApprovalTests使用黄金主范例来筛选捕获结果。如果你喜欢它,只需将文件重命名为.approved,测试就会通过。

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

查看Jeremy D. Miller的WIP Presentation Patterns wiki页面,了解重构灵感: )

米勒正在写一本书,看起来这对于这类事情来说似乎是必须的。

在测试我自己的UI控件时,我使用了NUnitForms,效果很好!如果您使用标准(或经过良好测试的)UI控件,我会同意其他有关重构的内容。

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

我已经尝试过TestComplete,但是我觉得它有点过于昂贵,因为我可以为c#中的图像比较编写类似的lib。因此,我的计划是分别测试控件,然后重构UI,就像我提到的那样。

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

当然,这可以说是单元测试,因为很难从前端创建测试单个工作单元的操作,而不是替代其他单元测试。我也同意前端业务逻辑尽可能薄。但是,这将填补您的单元测试未涵盖的任何空白。希望您的单元测试不会覆盖小的工作单元,因此编码的UI测试将捕获剩余的未测试单元。

Coded UI内置了最新版本的Visual Studio Premium。我建议您不要只使用记录功能,而是学习如何自己编写测试,因为这样可以提供更大的灵活性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top