单元测试现有的UI代码

时间:2012-03-09 09:16:03

标签: c# .net unit-testing user-interface mfc

我浏览了一段时间的互联网和这个网站,而不是找到一些单元测试我现有代码的方法,唯一的结果是将逻辑和用户分开(MVC方法)。虽然这对于新项目来说非常有用,但它耗费时间,因此对现有项目投资过于昂贵。是否有办法为现有的GUI项目创建特定的单元测试,理想情况下是自动化的,不幸的是,这些项目直接连接到数据库或其他系统以获取数据并且数据在显示之前被操纵?目前我们有两个项目,一个是MFC,另一个是C#.net 2.0,非常感谢。

6 个答案:

答案 0 :(得分:3)

考虑到您无法更改现有代码(更不用说您没有真正单元测试UI),单元测试不会在这里切入。您应该寻找某种GUI测试自动化/脚本工具。像Sikuli一样。从字面上引用他们网站上的第一段:

  

Sikuli是一种使用图像(屏幕截图)自动化和测试图形用户界面(GUI)的视觉技术。

它没有比那更简单。你“告诉”工具它应该观察/交互的UI部分,它会记录并重放它。浏览this presentation可以了解您可以做什么(也可以查看他们的视频)。可能不会解决你所有的问题,但可能是值得考虑的替代方案。

答案 1 :(得分:1)

对现有项目进行单元测试始终是一项挑战。但是我指出一些开源工具可以帮助你自动化单元测试

<强> C ++

Boost unit test framework

Google Mock

<强> C#

NUnit

NMock

答案 2 :(得分:1)

可以进行某种程度的自动化测试,但不能进行单元测试。

根据定义,单元测试测试从系统整体上分离的小单元逻辑。我建议用您描述的方式(mvc等)编写新代码以进行单元测试。

使用现有代码,单元测试显然需要重构,我感谢您不在时间范围内。您需要使用您所看到的方法来执行更多的全系统自动化测试,这可能是通过UI驱动的。这些不是单元测试的事实是,即使你有单元测试,也有有用的测试。当您在搜索资源时,了解区别很有帮助。

您可能最适合搜索自动ui测试。使用.net应用,您可能会发现White有用的内容

答案 3 :(得分:1)

如果您有幸拥有Visual Studio 2010的Premium(至少)版本,那么您可以考虑编写Coded UI Tests

UI测试基本上是GUI上的自动操作序列(鼠标,键盘......)。这些是非常高级别的测试(或功能测试),而不是单元测试,但它可以帮助测试已经存在的GUI应用程序。

例如,您可以轻松地自动化CRUD操作(暗示数据库)并检查(断言)操作在UI中产生预期结果(列表中新创建的项目......)。

答案 4 :(得分:1)

编写UI测试可能非常耗时,因为您必须测试各种方面。感谢上帝,有很多框架可以实现这个结果,但你总是要编写一些代码。

我假设您已经进行了单元测试(Visual Studio本身带有一个不太糟糕的单元测试框架),因此您要检查的不是算法,而是UI自动化/结果。这是什么意思? 代码的所有内容都必须通过代码进行测试(例如,数据库操作和算法)。甚至一些UI控件也可以通过代码进行某种程度的测试(例如:如果我模拟用户点击,那么当这个条件成立时我会触发该事件)。相信我,UI测试是黑色艺术,即使一切正常,你也会经常失败测试。

简单的压力情景

对于一个简单的场景,例如为了强调您的应用程序重现多次重复相同操作的错误,您可以使用宏录制器(例如WinMacro)。您注册用户输入,然后在循环中运行该宏。如果有一个微妙的错误,你有很多机会重现(和/或找到)它在一夜之间重复5000次。这样就可以从日志中获取数据。

简单场景

如果您的应用程序可以某种方式自动化(使用VSA可能很容易使用.NET应用程序),您可以准备一些“好”宏来自动执行操作,将结果放入文件并将其与已知文件进行比较好结果的数据文件。

简单提示:对于MFC应用程序,您可以使用文本文件编写自己的“宏”,其中每一行都是带有参数的Windows消息;阅读它,解析它并SendMessage()它们到您的应用程序来模拟用户输入,菜单点击等。抓取 - 例如 - 文本框值并与已知内容进行比较。 WinSpy ++是你的朋友。

复杂场景

对于其他任何事情(我的自定义控件是否以正确的方式绘制所有内容?当用户单击该按钮然后UI颜色发生变化?)时,您必须使用更复杂的工具。有几种自动化UI测试的工具,内置于Visual Studio 2010(不是每个版本),您需要创建编码的UI测试。这是什么意思?您编写代码来自动化您的应用程序,然后编写更多代码来检查其结果(有时甚至将位图与已知结果进行比较。这可能很繁琐但很多但实际上您可以测试所有内容,即使应用程序尚未设计用于UI测试。 从MSDN开始阅读。

还有很多商业工具(即使我从未在任何项目中使用它),所以我没有写任何链接,我猜你会在Google上有很多结果。

答案 5 :(得分:1)

模拟通常是模拟集成点的最佳方法,但遗憾的是,如果代码过于相互关联并将依赖项隐藏在私有方法等中,大多数Mocking框架都会失效。

可能值得研究一个名为Moles(由微软制造)的框架,它对你可以模拟的东西几乎没有限制。它甚至处理私人方法! 也许你可以用它来模拟你的db调用来测试你的数据操作? 在线有几个教程。 这是一个可能让你开始: http://www.unit-testing.net/CurrentArticle/How-To-Mock-Code-Dependencies-Using-Moles.html