【问题标题】:VB.net NUnit (2.5) Windows forms Testing - Is this possibleVB.net NUnit (2.5) Windows 窗体测试 - 这可能吗
【发布时间】:2011-12-10 04:19:47
【问题描述】:

我正在将单元测试改造成一个由其他开发人员在 VB.net 中设计和编写的相当复杂的系统。我正在尝试使用 NUnit 和 NUnit Forms 扩展为 GUI 表单开发单元测试。 (如果你有解决方案但不知道 VB 语法,只要它使用 NUnit 类,我一直在研究相当容易移植的 c# 示例)

我将尝试解释我在做什么,但首先是对该程序的简要说明。它基本上监视服务器活动。您需要通过带有 IP 和端口字段(以及其他字段)的模式表单连接到服务器。一旦您连接到服务器,程序的其他部分就会解锁并变得可用(例如服务器的配置)。

所需的过程:加载程序>单击连接按钮>模式连接表单加载>输入详细信息>单击确定连接>主表单更新到登录状态>其他功能

问题是我无法测试连接表单的功能,然后是程序的登录功能。我可以测试它是否正确加载模态连接表单;输入详细信息并单击“确定”(到目前为止一切正常),但它似乎没有按逻辑推进程序。模态表单似乎再次关闭,似乎没有从程序后端运行连接代码,我回到主菜单没有登录任何东西。

我有一种感觉,要么我错过了一些非常明显的东西,要么在 NUnit 中根本不可行。我已经在互联网上搜索了类似的东西,但最接近的是另一个非常通用的 SO 线程。由于无法实际测试程序的登录版本,我遇到了一个主要障碍。 另一个问题是处理没有唯一标识符的消息框(例如“你确定要退出吗?”);这些似乎也是 NUnit 的一大痛点

(如果有什么不同,我将使用对已构建项目的可执行文件的引用,而不是实际源代码,将测试作为独立项目运行)

如果需要,可以发布我的一些测试代码。

【问题讨论】:

    标签: vb.net winforms unit-testing testing nunit


    【解决方案1】:

    恕我直言,使 GUI 类可用于单元测试的最佳方法是应用 Model-View-Presenter pattern 并将表单 (=View) 类之外的几乎所有程序逻辑分解到单独的 Presenter 类中。然后你可以对 Presenter 类进行单元测试,而不需要像“NUnit Forms”这样的工具。

    阅读Michael Feathers' article "The Humble Dialog Box" 中的 C++ 示例,您可以轻松地将其应用到 Winforms,我猜。

    【讨论】:

    • 感谢您的及时回复。这是一篇有趣的文章,非常有用,不幸的是我不是说整个系统需要重新编码(我只是一个初级开发人员)。我只想把这个该死的单元测试排除在外。
    • 将一个对话框类拆分为 2 远不是“重新编码整个系统”(好吧,当你有一个包含 >20000 行代码的对话框时,它可能是)。想想你需要多少时间来为你的对话做这件事,以及你要投入多少时间来应对这种不稳定、效果不佳的“通过 GUI 进行单元测试”的方法。
    • @DocBrown:UI 测试不需要是不稳定的和糟糕的工作(代码重用等良好的编码原则也应该适用于 UI 测试)。此外,在使用遗留应用程序时,它几乎是您唯一的选择,您希望在重构代码并冒险破坏某些东西之前进行某种形式的测试。
    • @Meta-Knight:我使用了一些不同的 GUI 机器人工具,包括 Mercury(今天的 HP)的 WinRunner,它可能是该领域现有的最好的工具之一。这种体验几乎总是,好吧,让我们说“幻灭”。另一方面,将布局与逻辑分离并仅测试逻辑已被证明是一种非常有效的测试方式。
    • @DocBrown:如果我错了,请纠正我,但是像 WinRunner 这样的工具使用自定义脚本语言,这种语言不容易编码成可重用的函数。使用 NUnitForms 和 White 等工具,UI 测试是 .NET 代码,位于您的 VS 解决方案中,这使得重用变得更容易。但我完全同意将布局与逻辑分开是一种很好的做法,并且大多数测试应该是专注于逻辑的单元测试;-)
    【解决方案2】:

    我不确定 NUnit 表单,但使用 White library(也适用于 NUnit),您可以通过运行 exe 并模仿用户操作来测试应用程序。应用程序正常运行,因此所有应用程序逻辑都已执行。

    下面是一些使用 White 启动应用的示例代码:

    Dim app = White.Core.Application.Launch("MyApp.exe")
    

    从您的应用访问表单:

    Dim mainForm = app.GetWindow(SearchCriteria.ByAutomationId("MainForm"), 
                                 InitializeOption.NoCache)
    

    执行诸如单击菜单项之类的操作:

    mainForm.MenuBar.MenuItem("Edit", "Jobs...").Click()
    

    获取控件并验证其状态:

    Dim someTextBox = mainForm.Get(Of TextBox)(SearchCriteria.ByAutomationId("txtValue"))
    Assert.IsTrue(someTextBox.Text = "12345")
    

    我不确定 NUnit Forms 是否具有类似的功能,但如果没有,也许您应该研究一下 White。我在设置它时遇到了一些问题,因此请确保在设置之前仔细阅读文档(不幸的是不是很详尽)。

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多