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

问题描述:

我一直在阅读很多关于测试驱动开发的内容,并决定让它在一个小项目上发挥作用。作为参考,我目前正在阅读“面向对象的软件,以测试为指导”。如何为Mac(Cocoa)应用程序创建端到端测试?

我明白如何单元测试我的应用程序,以及如何单元测试用户界面的某些部分,但我正在努力设置端到端测试。例如,测试通过整个应用程序的某个路径会产生正确的输出(这是我对端到端测试的基本理解)。

没有必要模拟点击事件,但需要与UI进行某种连接。

我是否认为我需要结合使用“逻辑”测试(测试无需启动应用程序),“应用程序”测试(启动应用程序测试)以及GHUnit之类的异步功能来完成此操作?

编辑:

阅读下面的一些问题的答案后,这听起来像我在寻找功能的终端到终端的测试,但我想我应该给一个测试的例子,因为我想象它。

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

KIF听起来像它可以工作,因为它有步骤来检查UI元素的变化,它看起来像还有一个Mac OSX分支。我确信我也可以写一个小班,不断调查用户界面以了解某些时间后的变化,但我想知道这是否正确。但是,也许我正试图把我正在阅读的'正在成长的面向对象软件,由测试引导'并尝试将其应用于Cocoa。

另一个更新:

所以我一直在阅读的建议,到目前为止,检查连接到不同的地方,并开始实施的东西,同时还引用了这本书。我认为我真正想要得到的是Test-Driven-开发部分。在本书中最突出的是,他们从用户的角度首先描述了他们想要通过验收测试发生的事情。

我意识到,只要开始编写方法,就需要进行坚实的单元测试,但我很想首先使用一些UI编写一些高级验收测试。我已经开始编写自己的应用程序“驱动程序”类,使用一些类似于GHAsyncTestCase想法的方法来帮助我实现这一点。这听起来是否正确/有用/必要?

到目前为止,我非常感谢所有的评论,他们确实帮助我在自己的脑海中摸索出了自己想要做的事情以及测试的各个方面。我会很快完成这个问题,因为它变得相当大,所以任何最后的建议是值得欢迎的!

+1

伟大的第一个问题! – logancautrell

我认为我从“面向对象的软件”中获得的关键是尽可能地从UI中分离出来。如果没有代码来看待这个问题很难提供建议,但通过修改,我会认为将用户界面中的“验证一个标签说..”位分开。什么是设置此消息,并且您可以只测试该事件吗?

越能够从UI中分离出越多的单元测试(更快更简单),而不是整合UI元素的其他框架或驱动程序。

+0

尽管我也得到了这个分离消息,但他们几个主要的“端到端”测试确实有诸如“在执行此操作后检查标签说明了这一点”之类的事情。我是不是在这上面挂了?但是,是的,也许我应该更多地从UI上解耦。 – Adam

+0

在开始编写测试并开始测试驱动开发之后,我意识到实际测试UI的需求仅限于少数几种情况,并且大部分时间您都可以通过解耦UI和使用mock来解决此问题。尽管此主题中的所有答案都能帮助我理解,但您最接近我最终发现的内容。 – Adam

我相信你可以使用辅助功能来编写UI脚本。我会检查WWDC 2011的视频,其中一个标题为“简化Mac可访问性的设计模式”。他们在2010年做了类似的事情。

+0

虽然该视频和辅助功能很有帮助,但它并不完全涵盖我想了解更多关于Cocoa和Xcode的完整端到端体验。我还说过,仿真用户交互对于端到端测试并不是必需的(据我所知)。 – Adam

根据你对@Norman的回应,我想你正在寻找既能实现端到端功能,又能实现基于UI的端到端的建议,但也许是UI自动化框架可能改变你的想法?侵入性的东西像FoneMonkey可能会有所帮助: http://www.gorillalogic.com/fonemonkey

如果不为你工作,我会想知道为什么&什么“缺口”你在这样的UI驱动测试与基于代码的功能测试察觉?

+0

谢谢,我想我甚至可能对你提到的“差距”有些困惑,所以我试图改进我的问题。 FoneMoney看起来与KIF类似,尽管我没有在Mac版上看到提及。 – Adam

您可能会感兴趣广场的KIF框架:http://corner.squareup.com/2011/07/ios-integration-testing.html

它看起来集成/ UI测试真的很酷。

+0

谢谢,这看起来非常有趣,它也看起来像专门为Mac OSX的分支。以防万一,我在我的问题上加了一点澄清。 – Adam