【问题标题】:Unit Test existing UI code单元测试现有的 UI 代码
【发布时间】:2012-03-26 18:06:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    对现有项目进行单元测试始终是一项挑战。但是我会向您指出一些开源工具,它们将帮助您自动化单元测试

    C++

    Boost unit test framework

    Google Mock

    C#

    NUnit

    NMock

    【讨论】:

      【解决方案2】:

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

      单元测试,顾名思义,测试与整个系统解耦的小逻辑单元。我建议以您描述的方式(mvc 等)编写新代码以进行单元测试。

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

      您可能最好搜索自动化 ui 测试。使用 .net 应用程序,您可能会发现类似 White 的内容很有用

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 感谢您的信息,不幸的是,我们将 VS 05 用于 C# 和 VS 97 MFC :)
        【解决方案4】:

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

        我假设您已经进行了单元测试(Visual Studio 本身带有一个不那么糟糕的单元测试框架)所以您要检查的不是算法,而是 UI 自动化/结果。这是什么意思?所有代码都必须通过代码(例如数据库操作和算法)进行测试。甚至某些 UI 控件也可以通过代码以某种方式进行测试(例如:如果我模拟用户单击,我将在此条件为真时触发该事件)。相信我,UI 测试是一门玄学,即使一切正常,您也经常会得到失败的测试。

        简单的压力情景

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

        简单场景

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

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

        复杂场景

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

        还有大量的商业工具(即使我从未在任何项目中使用过)所以我不写任何链接,我猜你在谷歌上会有很多结果。

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            Mocking 通常是模拟集成点的最佳方法,但不幸的是,如果代码过于互连并且将依赖项埋在私有方法等中,大多数 Mocking 框架就会失败。

            可能值得研究一个名为 Moles(由 Microsoft 制造)的框架,它对您可以模拟的内容几乎没有限制。它甚至可以处理私有方法! 也许你可以用它来模拟你的数据库调用来测试你的数据操作? 网上有几个教程。 这可能会让您入门: http://www.unit-testing.net/CurrentArticle/How-To-Mock-Code-Dependencies-Using-Moles.html

            【讨论】:

              猜你喜欢
              • 2016-02-02
              • 2010-11-19
              • 1970-01-01
              • 1970-01-01
              • 2010-12-03
              • 2015-10-16
              • 1970-01-01
              • 2011-07-07
              • 1970-01-01
              相关资源
              最近更新 更多