12

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

4

8 回答 8

5

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

Martin Fowler 的 Refactoring 书中有一小章讨论了重构不可测试的 UI。您还可以阅读有效地使用旧代码。

注意:有一些工具可用于自动化 UI 测试。我想到了 SilkTest。但如果可能的话,我不会使用它们。

于 2008-12-30T22:15:35.157 回答
3

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

于 2010-03-24T23:22:34.673 回答
2

我使用此处详细介绍的被动视图架构http://martinfowler.com/eaaDev/PassiveScreen.html

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

然后流程继续 用户单击一个按钮。按钮调用相应 UI 类的方法。传递任何需要的参数。UI 类方法修改模型。然后使用界面更新 UI。

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

于 2008-12-30T23:16:47.513 回答
1

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

这里有一个如何做到这一点的视频:https ://www.youtube.com/watch?v=hKeKBjoSfJ8

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

ApprovalTests 使用黄金大师范式对结果进行屏幕捕获。如果您喜欢它,只需将文件重命名为 .approved 即可通过测试。

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

于 2012-04-24T07:42:34.157 回答
1

对于 Windows 10,微软现在推荐使用带有 WinAppDriver 的 Appium。VS 2019 将是最后一个包含 Microsoft Coded UI 的版本。

https://docs.microsoft.com/en-us/visualstudio/test/use-ui-automation-to-test-your-code?view=vs-2019

于 2019-11-27T20:00:50.400 回答
0

查看 Jeremy D. Miller 的 WIP Presentation Patterns wiki 页面以获得重构灵感:)

米勒正在写一本书,看起来它将成为这类事情的必备品。

于 2009-10-25T18:13:08.007 回答
0

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

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

我已经为此尝试过TestComplete,但我认为它有点太贵了,因为我可以编写一个类似的库来仅在c#中进行图像比较。所以我的计划是分别测试控件,然后重构 UI,就像我的其他人提到的那样。

于 2010-10-19T07:15:11.157 回答
0

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

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

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

于 2014-06-19T09:12:11.010 回答