2009-06-22 65 views
6

我想为我的Cocoa应用程序的GUI部分编写单元测试。如何在Xcode中编写GUI的自动单元测试?

在教科书单元测试中,有一个测试框架和测试用例可以调用被测单元。该单元下的所有代码都被嘲笑。因此,输入和输出都受到控制和监控;只有被测单元中的代码被测试。

我想在被测单元做我的GUI时做同样的事情:
1)设置某种框架,我可以编写代码来操纵和检查GUI控件。
2)连接我的GUI控件来模拟我的实际代码,而不是真实的实例。
3)运行测试,该测试操纵控件,然后检查模拟对象以查看是否使用正确的参数调用了正确的方法,并检查GUI以查看来自模拟对象的响应是否导致小部件的正确更改。

任何人都这样做?如果是这样,怎么样?关于如何做到这一点的任何想法?

感谢,

帕特

(编辑),举个很具体的例子,我想:
1)编写一个测试情况下将选择菜单项 'MyMenu菜单' - >“MyItem ”。在这个测试案例中,我想检查一下,方法[AppDelegate doMyItem]被调用一次,并且AppDelegate中没有其他方法被调用。
2)生成AppDelegate的模拟对象。 (我知道如何做到这一点)
3)以某种方式(handwaving这里)链接我的应用程序,以便AppDelegate的模拟实例链接而不是真实的。
4)运行测试。注意它失败,因为1)我还没有创建MyMenu。 2)我还没有创建MyItem。 3)我还没有完成IB工作来将MyItem连接到[AppDelegate doMyItem],或者4),因为我还没有编写'doMyItem'方法。
5)解决上述四个问题(如果我那天感觉真的很迂腐,一次一个)。
6)再次运行测试并观察成功。

这是否使问题清楚?

回答

1

下面是一些普遍采用这种方法的流行方法(应该使用大多数(如果不是所有的可可兼容语言))。

1 - 创建一个回调接口。创建GUI元素时的一个输入是该接口的实现。当有用户交互时,GUI元素在该接口上调用更新功能。有一个真正的实施和测试实施。

2 - 使用事件处理程序。用一个或多个事件处理程序注册所有GUI元素,并让GUI在用户交互中生成事件。有两个实现的事件处理程序接口,其中一个用于实际使用,另一个用于测试。

编辑:哎呦,错过了要求#1。从来没有用OSX特定的控件做过这件事,但通常有两种方法。

1 - 创建一个生成类似用户输入的脚本或应用程序。具有不容易实际检查GUI的缺点。你反而需要生成好的测试用例来确保应该存在的所有东西,而且没有什么额外的东西。

2 - 创建与测试实施,取代的渲染和界面层的界面。这是一个像SDL和DirectFB的和库更容易使少用的东西像OSX API,WIN32 API等

编辑:应对问题进行编辑。

在您的例子的情况下,使用一个单独的测试程序和事件处理程序下面是它想看看:

您的测试应用程序是一个简单的应用程序或脚本,启动你的图形用户界面,然后生成鼠标/键盘基于输入文件的事件。正如我所说,从来没有在OSX(只有QNX)做过。运气好的话,您可以使用API​​生成鼠标和键盘事件,但是如果可能的话,您必须询问其他人。

因此,为您的测试案例创建一个输入。测试应用程序将解析这个知道该怎么做。它可能是这样简单的XML:

<testcase name="blah"><mouseevent x="120" y="175" type="click"/></testcase> 

或任何鼠标序列可能实际上。

当你的脚本执行该命令会点击该按钮鼠标。你的事件处理程序将会接受这个。但是现在您应该使用--test标志或其他标志来运行您的应用程序,以便它实际上使用测试事件处理程序。测试事件处理程序可以执行一些自定义操作,而不是执行通常的应用程序。例如,它可以执行一些正常的操作(您仍然需要GUI来响应),然后通过套接字,管道等任何方式将消息发送到测试应用程序。

测试应用将拿起此消息,并把它比作什么希望看到的。所以,现在也许你的测试用例XML看起来是这样的:

<testcase name="blah"> 
    <mouseevent x="120" y="175" type="click"/> 
    <response>doMyItem() called</response> 
</testcase> 

如果从事件处理程序生成的响应是不同的,那么测试失败。您可以打印出实际响应以帮助进行调试。

+0

Patros嗨, 关于你的第二#1,我不太明白这句话的意思是生成用户输入一样“。你可以给我一个例子吗? 谢谢, 帕特 – 2009-06-22 21:01:31

+0

它只是意味着产生你想看到的键盘和鼠标事件。您可以通过包装本机UI类并劫持它们的事件,可能通过访问API或编写自定义驱动程序来实现此目的。 – patros 2009-06-22 21:29:23

3

两个原则,两个环节:

  • 使视图一样傻乎乎的可能,与passive view模式:这使GUI更容易测试
  • :信托可可执行按钮,菜单,.. 。但请确认target and action连接正确,bindings正如预期。
1

你看着无障碍框架?它应该让一个应用程序检查另一个应用程序的UI并生成类似用户的交互事件。

Accessibility Overview