我正在将单元测试改造成由VB.net中其他开发人员设计和编写的相当复杂的系统。我尝试使用NUnit和NUnit Forms扩展为GUI表单开发单元测试。 (我一直在研究c#示例,如果你有一个解决方案很容易移植,但只要它使用NUnit类就不知道VB语法)
我会尝试解释我在做什么,但首先要简要介绍一下该程序。它基本上监视服务器活动。您需要通过具有IP和端口字段(以及其他)的模式窗体连接到服务器。一旦连接到服务器,程序的其他部分就会解锁并变得可用(例如服务器的配置)。
期望的过程:加载程序>点击连接按钮>模态连接形式负载>输入详细信息>单击“确定”以连接>主表单更新到登录状态>其他功能
问题是我无法测试连接表单的功能,然后测试程序的登录功能。我可以测试正确加载模态连接形式;输入详细信息并单击“确定”(所有这些都很好),但它似乎没有从逻辑上推进程序。模态形式再次关闭,似乎没有从程序后端运行连接代码,我回到主菜单没有登录到任何东西。
我有一种感觉,我要么错过了一些非常明显的东西,要么就是在NUnit中根本不可行。我已经在互联网上寻找类似的东西,但最接近的是另一个非常通用的SO线程。由于无法真正测试该程序的登录版本,我处于一个主要障碍。 另一个问题是处理没有唯一标识符的消息框(例如“你确定要退出吗?”);这些似乎也是NUnit屁股的主要痛苦
(如果它有任何区别,我使用对已构建项目的可执行文件的引用而不是实际源代码来运行测试作为独立项目)
如果需要,可以发布我的一些测试代码。
答案 0 :(得分:2)
恕我直言,使GUI类可用于单元测试的最佳方法是应用Model-View-Presenter pattern并将几乎所有程序逻辑从形式(= View)类中分解为单独的Presenter类。然后,您可以对Presenter类进行单元测试,而无需使用“NUnit Forms”等工具。
阅读Michael Feathers' article "The Humble Dialog Box"以获取C ++中的示例,我猜你可以轻松地将其应用于Winforms。
答案 1 :(得分:0)
我不确定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。我遇到了一些设置问题,所以在设置之前一定要仔细阅读文档(不幸的是不是很详尽)。