首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用Xcode编写GUI的自动化单元测试?

如何用Xcode编写GUI的自动化单元测试?
EN

Stack Overflow用户
提问于 2009-06-22 19:27:14
回答 3查看 1.6K关注 0票数 6

我只想编写Cocoa应用程序的GUI部分的单元测试。

在教科书中的单元测试中,有一个测试框架和测试用例来调用被测单元。该单元下面的所有代码都被模拟出来了。因此,输入和输出都是受控制和监视的;只测试被测单元中的代码。

我想在被测单元是我的GUI的情况下做同样的事情:

1)建立某种框架,我可以在其中编写操作和检查GUI控件的代码。

2)将我的GUI控件连接到我实际代码的模拟,而不是真实的实例。

3)运行测试,该测试操作控件,然后检查模拟对象以查看是否使用正确的参数调用了正确的方法,并检查GUI以查看来自模拟对象的响应是否导致小部件中的正确更改。

有人这么做吗?如果是这样的话,是怎么做的?你知道我该怎么做吗?

谢谢,

拍拍

(编辑)为了给出一个非常具体的例子,我想:

1)编写一个测试用例,它将选择菜单项'MyMenu‘-> 'MyItem’。在此测试用例中,我希望检查AppDelegate doMyItem方法是否只被调用了一次,并且AppDelegate中的其他方法都没有被调用。

2)生成AppDelegate的模拟对象。(我知道怎么做)

3)以某种方式(这里是手势)链接我的应用程序,以便链接AppDelegate的模拟实例,而不是真正的实例。

4)运行测试。看着它失败,因为1)我还没有创建MyMenu。2)我还没有创建MyItem。3)我还没有完成将MyItem连接到AppDelegate doMyItem的IB工作,或者4)因为我还没有编写'doMyItem‘方法。

5)解决上述四个问题(如果我觉得那天真的很书呆子气,一次一个)。

6)再次运行测试并观察其成功。

这让问题变得清晰了吗?

EN

回答 3

Stack Overflow用户

发布于 2009-06-22 21:40:41

两个原则,两个环节:

Trust使用passive view模式尽可能地简化视图:这使得图形用户界面更容易对按钮、菜单等的

  • 实现进行test
  • Trust but verify:。但是要验证target and action是否正确连接,bindings是否如预期。
票数 3
EN

Stack Overflow用户

发布于 2009-06-22 20:11:43

这里有几种常用的方法(如果不是所有的可可兼容语言,也应该适用于大多数兼容的语言)。

1-创建回调接口。创建GUI元素时的输入之一是该接口的实现。当有用户交互时,GUI元素调用该界面上的更新函数。有一个真实的实现和一个测试实现。

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

编辑:糟糕,遗漏了需求#1。OSX特定的控件永远不会做到这一点,但通常有两种方法。

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

2-使用测试实现创建一个替换呈现和接口层的接口。使用像SDL或directFB这样的库更容易,而使用OSX API、win32 API等就不那么容易了。

编辑:响应有问题的编辑。

在您的示例中,使用单独的测试应用程序和事件处理程序如下所示:

您的测试应用程序是一个简单的应用程序或脚本,它启动GUI,然后根据输入文件生成鼠标/键盘事件。正如我已经说过的,永远不要在OSX (只有QNX)中这样做。如果幸运的话,您将能够使用API生成鼠标和键盘事件,但您必须询问其他人是否可能。

因此,为您的测试用例创建一个输入。测试应用程序将对此进行解析,以了解要执行的操作。它可能是如下所示的简单XML:

代码语言:javascript
运行
复制
<testcase name="blah"><mouseevent x="120" y="175" type="click"/></testcase>

或者鼠标序列实际是什么。

当您的脚本执行该命令时,它将在该按钮上单击鼠标。您的事件处理程序会注意到这一点。但是现在您应该使用--test标志或诸如此类的东西来运行您的应用程序,以便它实际上使用了test事件处理程序。测试事件处理程序可以执行一些自定义操作,而不是执行应用程序通常执行的操作。例如,它可能会执行一些正常的操作(您仍然需要GUI来响应),然后向您的测试应用程序发送一条消息(通过套接字、管道等)。

您的测试应用程序将获取此消息,并将其与预期看到的内容进行比较。因此,现在您的测试用例XML可能如下所示:

代码语言:javascript
运行
复制
<testcase name="blah">
   <mouseevent x="120" y="175" type="click"/>
   <response>doMyItem() called</response>
</testcase>

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

票数 1
EN

Stack Overflow用户

发布于 2009-07-02 05:20:44

你研究过可访问性框架吗?它应该让一个应用程序检查另一个应用程序的UI,并生成类似用户的交互事件。

Accessibility Overview

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1028969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档