你如何单元测试大量MFC UI应用程序?
我们已经开发了很多年了几个大的MFC应用程序,我们使用一些标准的自动化QA工具来运行基本的脚本来检查的基本面,打开文件等,这些由QA组运行后的每日构建。
但是,我们想提交代码的每日构建之前引入针对对话框,菜单和应用程序的其他视觉元素等程序,个别开发人员可以构建和运行测试。
我已经上只出现在调试版本,是否有这方面的任何标准工具包对话框听说过这种技术为隐藏测试按钮。
环境是C ++ / C / FORTRAN,2005 MSVC,英特尔Fortran 9.1的Windows XP / Vista x86系统和64位。
这取决于应用程序是如何构成的。 如果逻辑和GUI代码分离(MVC)然后测试该逻辑是容易的。 看看迈克尔羽毛“卑微的对话框” (PDF)。
编辑:如果你想想看:你应该非常仔细地重构,如果应用程序没有结构化的方式。 不存在其他的技术来测试逻辑。 它模拟点击脚本只是表面。
它实际上是很容易的:
假设你的控制/窗/当用户点击一个按钮,你要确保列表框中包含点击后的正确的东西全部更改列表框的内容。
- 重构,以便有与物品列表框来显示一个单独的列表。 项目被存储在列表中,而不是从你的徘徊无论数据来自提取。 这使得列表框列表事情的代码只知道有关新名单。
- 然后创建一个新的控制器对象,将包含逻辑代码。 处理该按钮,点击该方法只要求mycontroller-> ButtonWasClicked()。 它不知道该列表框或者anythings。
- :: myController的ButtonWasClicked()做什么需要预定逻辑做的,准备项目清单,并告诉更新控制。 对于工作,你需要解耦控制,并通过创建控制接口(纯虚类)的控制。 控制器仅知道类型的对象,而不是控制。
而已。 该控制器包含逻辑代码,并且知道仅通过接口控制。 现在,您可以通过嘲弄控制写正单元测试:: myController的ButtonWasClicked()。 如果你不知道我在说什么,读迈克尔斯文章。 两次。 并再次之后。
(注意自我:必须学会不说废话那么多)
既然你提到的MFC,我以为你有一个应用程序,这将是艰难的自动化测试工具下得到的。 你会看到,当你为你写的代码建立测试单元测试框架的最佳效益。但试图在测试驱动的方式添加新的功能,这是不设计成可测试的应用程序..可以努力工作和好沮丧。
现在我所要提出肯定是艰苦的工作 ..但也有一些纪律和毅力,你会看到的好处很快。
- 首先,您需要一定的管理后盾,为新的修复采取多一点的时间。 确保每个人都明白这是为什么。
- 接下来买的副本WELC书 。 读它从头到尾,如果你有时间或者如果你很难,扫描,找到您的应用程序表现出症状的指标。 这本书包含了很多很好的意见和就是你所需要的试图让现有的代码可测试的时候。
- 那么对于每一个新的修复/更改,花一些时间,并了解你要工作的区域。 写在你的选择(免费提供)的变型的xUnit一些测试行使当前行为。
- 确保所有的测试都通过了。 写一个新的测试,练习需要的行为或错误。
- 编写代码来使这最后测试通过。
- 区域内无情地重构下的测试,以提高设计。
- 重复,你必须从这里开始对系统做每一个新变化。 无例外情况。
- 现在应许之地 :不久日益增长的很好的测试代码岛将开始浮出水面。 越来越多的代码将属于自动化测试套件下和变化逐渐变得更容易做出。 这是因为,稳扎稳打的基础设计变得更加可测试。
最简单的办法是我以前的答案。 这是困难的,但正确的出路。
我意识到这是一个过时的问题,但对于我们这些谁仍与MFC的工作,微软的C ++单元测试框架在VS2012效果很好。
的一般程序:
- 编译您的MFC项目作为静态库
- 添加一个新的本地单元测试项目,以您的解决方案。
- 在测试项目中,添加您的MFC项目作为参考。
- 在测试项目的配置属性,添加包含目录的头文件。
- 在链接器,输入选项添加MFC.lib; nafxcwd.lib; libcmtd.lib;
- 在“忽略特定的默认库”添加nafxcwd.lib; libcmtd.lib;
- 在常规添加MFC的位置导出的库文件。
该https://stackoverflow.com/questions/1146338/error-lnk2005-new-and-delete-already-defined-in-libcmtd-libnew-obj有,为什么需要nafxcwd.lib和libcmtd.lib一个很好的说明。
另一个重要的事情在传统项目检查。 在常规配置属性,确保这两个项目都使用相同的“字符集”。 如果您的MFC使用多字节字符集,你需要的MS测试这样做也是如此。
虽然并不完美,我发现这样做的最好的是AutoIt的http://www.autoitscript.com/autoit3
“AutoIt的V3是一个免费的类似BASIC脚本语言设计自动化的Windows GUI和一般的脚本。它采用模拟按键,鼠标移动和窗口/控制操作的组合,以自动化的方式任务不可能或与其他可靠语言(如VBScript和的SendKeys)。AutoIt的也非常小,自成一体,将在所有版本的Windows上运行外的开箱即用的,无需恼人的“运行环境”!”
这种运作良好,当你有驱动访问应用程序的源代码,因为你可以用你想开车控件的资源ID号。 这样一来,你就不必担心在特定的像素模拟鼠标点击。 不幸的是,在传统的应用程序,你可能会发现,资源ID不是唯一的,这可能会导致问题。 然而。 这是非常简单的改变的ID是唯一的重建。
另一个问题是,你会遇到时序问题。 我没有为这些一个尝试和真正的解决方案。 试错是我用过的东西,但是这显然不是可伸缩的。 问题是,在AutoIt脚本必须等待测试应用程序响应命令脚本发出一个命令之前或检查正确的响应。 有时它是不容易找到一个方便的事件等待和观看。
我的感觉是,在开发新的应用程序,我就坚持以一致的方式对信号“READY”。 这将有助于人类用户以及测试脚本! 这可能是一个遗留应用程序是一个挑战,但也许你可以在有问题的点介绍它,慢慢地维护不断蔓延到整个应用程序。
虽然它不能处理的UI端,使用加速测试库我的单元测试MFC代码。 有入门的一个代码项目的文章:
设计与升压强大的对象
嗯,我们必须在工作间这些堆积如山的MFC应用程序之一。 它是一种巨大的痛苦,以维持或扩大目前...它的泥球庞大,但它在moolah.Anyways耙
HTH
其实我们一直在使用Rational Team测试,然后机器人,但在最近与理性的讨论,我们发现他们没有计划,以支持原生64位应用程序更加专注于.NET,所以我们决定改用自动QA工具。 这是伟大的,但许可费用不允许我们启用它为所有开发人员。
我们所有的应用程序支持的脚本,这是我们通过VB回归测试一个COM API,但没有测试API应用程序本身。
理想情况下,我会感兴趣的人的CppUnit和类似的单元测试框架如何融入在显影剂程度的应用。