如何为Mac(Cocoa)应用程序创建端到端测试?

15

我一直在阅读关于测试驱动开发的内容,并决定在一个小项目上试试。参考资料是《Growing Object-Oriented Software, Guided by Tests》。

我知道如何对应用程序进行单元测试,也知道如何单元测试某些 UI 部分,但设置端到端测试让我感到困难。例如,测试通过整个应用程序的某个路径生成正确的输出(这是我对端到端测试的基本理解)。

无需模拟点击事件,但需要与 UI 有某种连接。

我认为我需要结合“逻辑”测试(不启动应用程序的测试)、“应用程序”测试(启动应用程序的测试)以及像 GHUnit 这样的异步功能才能实现这一点,这样想对吗?

编辑:

阅读下面一些答案后,听起来我正在寻找功能端到端测试,但我认为我应该举个例子说明我所想象的测试。

  1. 启动应用程序。
  2. 使用测试用户凭据调用登录函数。(注意:不一定需要 UI 自动化)。
  3. 验证窗口上的标签显示“正在登录...”。
  4. 成功验证用户后,验证标签现在显示“欢迎,Adam!”。

KIF 看起来可以工作,因为它有步骤来检查 UI 元素的更改,并且看起来还有一个 Mac OSX 分支。我相信我也可以编写一个小类,不断轮询我期望的 UI 更改并在一定时间后超时,但我想知道这是否是正确的方法。

然而,也许我正在尝试将我在《Growing Object-Oriented Software, Guided by Tests》中阅读到的内容过于文字化地应用到 Cocoa 上。

另一个更新:

我一直在阅读建议,查看了各个链接,并开始实施一些东西,同时仍然参考书籍。我认为我真正想要的是测试驱动开发部分。在这本书中最引人注目的是,他们首先使用验收测试从用户的角度描述了他们想要发生的事情。

我意识到,一旦开始编写方法,坚实的单元测试是必要的,但我很想先编写一些高级别的验收测试,使用一些 UI。我已经开始编写自己的应用程序“驱动器”类,使用一些与 GHAsyncTestCase 相似的方法来帮助我完成这个过程。这样做听起来正确/有用/必要吗?

非常感谢迄今为止所有的评论,它们确实帮助我理清了自己的想法和不同测试领域。我很快就会结束这个问题,因为它变得相当庞大,所以欢迎任何最后的建议!

4个回答

3
我认为我从《Growing Object Orientated Software》中获得的关键是尽可能地与UI解耦。没有代码,很难给出建议,但通过您的修改,我认为可以将“验证标签是否说…”这一部分与UI分离。是什么设置了这个消息,你能否只测试该事件?
您能够从UI中解耦的越多,就越能进行单元测试(更快,更容易),而不是集成其他框架或UI元素的驱动程序。

虽然我也收到了这个解耦信息,但他们的几个主要的“端到端”测试确实有一些东西,比如“执行此操作后检查标签是否说了这个”。我是不是太在意这个了?但是是的,也许我应该更多地从UI中解耦。 - Adam
在开始编写测试并采用测试驱动开发后,我意识到实际上需要测试用户界面(UI)的情况是非常有限的,大部分情况下可以通过解耦UI并使用模拟对象来避免这种情况。虽然这个主题中所有的答案都对我的理解有所帮助,但你的回答最接近我最终发现的情况。 - Adam

1

谢谢,这看起来非常有趣,而且似乎还有一个专门针对Mac OSX的分支。以防万一,我已经对我的问题进行了一些澄清。 - Adam

0

根据您对@Norman的回答,我猜想您正在寻找涵盖功能端到端以及基于UI端到端的建议,但也许一个UI自动化框架可以改变您的想法?像FoneMonkey这样具有侵入性的工具可能会有所帮助:http://www.gorillalogic.com/fonemonkey

如果这对您不起作用,我很想知道为什么以及您认为UI驱动测试与基于代码的功能测试存在何种“差距”?


谢谢,我认为我可能对你提到的“差距”也有点困惑,所以我尝试改进了我的问题。FoneMoney看起来类似于KIF,尽管我没有看到Mac版本的提及。 - Adam

0

我相信你可以使用辅助功能来编写UI脚本。我建议你查看WWDC 2011视频,其中有一个名为“Design Patterns to Simplify Mac Accessibility”的视频。他们在2010年也做了类似的事情。


虽然那个视频和辅助功能很有帮助,但它并没有完全涵盖我想更深入了解与Cocoa和Xcode相关的端到端体验。我还指出,模拟用户交互实际上对于端到端测试并不是必要的(就我所知)。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接