单元测试很棒,但是

Posted

技术标签:

【中文标题】单元测试很棒,但是【英文标题】:Unit Testing is Wonderful, But 【发布时间】:2010-09-30 20:46:57 【问题描述】:

我花时间设置了一些单元测试并在 XCode 等中设置了目标,它们对一些类非常有用。然而:

我想测试我不想启动整个应用程序的小 UI 片段。 没有通过/失败的概念:我需要“查看”这些片段,并且我可以创建所有相关类的虚拟实例来执行此操作。我的问题是:如何在 XCode 中进行设置?

我意识到我可以为每个类(或类组)使用另一个 XCode 项目,但这似乎有点麻烦。每个人的另一个目标?

【问题讨论】:

【参考方案1】:

我知道您正在寻找一种不需要功能齐全的应用程序来测试 UI 组件的方法,但我对 ios 4.0 中引入的新 UI 自动化工具可以让您做的事情印象深刻。

此工具可让您使用 javascript 脚本以交互方式测试应用程序的界面,并且无需检查屏幕上的确切像素值或位置。它使用系统中存在的内置辅助功能挂钩,以便 VoiceOver 识别组件并与之交互。

使用这个工具,我已经能够编写测试脚本,在用户与其交互时充分运用我的应用程序,以及在特定区域敲击并寻找细微的内存积累的测试。

Instruments 这部分的文档有点少,但是我最近教了一门课程,涵盖了视频是available on iTunes U 免费的视频(查找秋季学期的测试课程)。我的course notes(VoodooPad 格式)也涵盖了这一点。我还强烈推荐观看WWDC 2010 video session 306 - “Automating User Interface Testing with Instruments”。

【讨论】:

有时我想知道为什么我会问这么多关于 SO 的问题,但有时我会收到这样的回复,它打开了一扇我什至不知道的门。谢谢你。【参考方案2】:

好吧,即使该 GUI 是大型应用程序的一部分,您也不能将显示某个 GUI 的一部分称为测试。您可以在这里做的是创建一个单独的可执行目标并编写一个小工具,该工具可以重用应用程序中的 GUI 组件并根据输入参数向您显示它们。这将消除对许多不同目标的需求。

如果您仍然坚持使用单元测试,您可以显示您的 GUI 一段时间,例如 10 秒。所以测试用例会一直运行,直到 GUI 关闭或超时,每个测试最多需要 N 秒才能执行。

【讨论】:

谢谢,关于它不是“测试”的观点。那么这些是同一个 XCode 项目中的新目标,还是不同的? @Yar:这更像是个人喜好问题。把它放在同一个项目中对我来说更方便。【参考方案3】:

这是个好问题。我认为您实际上不想对那些“视觉确认”使用单元测试。就我个人而言,我通常编写小测试应用程序来进行此类测试或开发。我不喜欢在同一个项目中使用单独的目标,所以我通常只在原始项目旁边创建一个测试项目,然后使用相对路径引用这些类和资源。少杂乱。能够在自己的小测试环境中测试更复杂的用户界面元素真是太好了。

【讨论】:

有趣...我在考虑单独的 XCode 项目,只是想确保我是理智的 :)【参考方案4】:

我会对 UI“单元测试”采取两级方法:

    虽然 Cocoa/CocoaTouch 仍然比 Model-View-ViewModel 范式更接近于 Model-View-Controller,但通过将“视图”分解为“视图模型”和一个“演示者”视图(请注意,这有点类似于 NSView/NSCell 对;Cocoa 工程师很久以前就有这个)。如果视图是一个简单的表示层,那么您可以通过单元测试“视图模型”来测试视图的行为

    要测试视图的绘制/渲染,您必须进行人工测试或进行基于渲染/像素的测试。 Google's Toolbox for Mac 有几个工具可以对渲染的 NSView、CALayers、UIView 等进行逐像素比较。我为 Core Plot 项目编写了 tool 来处理测试失败并将参考文件合并回来有点更容易进入你的单元测试包。

【讨论】:

以上是关于单元测试很棒,但是的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OCMock 3 在单元测试中检查函数的返回值

在单元测试中捕获调试窗口输出?

如何在 VueJS 中对 Vuex 动作进行单元测试

Java单元测试初体验,全面讲解Java的单元测试(JUnit4)

Java单元测试初体验,全面讲解Java的单元测试(JUnit4)

Java单元测试初体验,全面讲解Java的单元测试(JUnit4)