iOS - 如何区分 UI 和单元测试,以及如何在这种具体情况下使用它们?

Posted

技术标签:

【中文标题】iOS - 如何区分 UI 和单元测试,以及如何在这种具体情况下使用它们?【英文标题】:iOS - How to differentiate UI and Unit tests, and how to use them in this concrete situation? 【发布时间】:2018-10-05 15:21:26 【问题描述】:

我对 UI 和单元测试完全是初学者,对如何使用它们以及如何区分它们非常困惑。所以我想到了以下用例:

我有一个用户有一组MyData,一个像这样的简单对象:

class MyData: NSObject 
    var settled: Bool?
    var id: String?


class User 
    var datas: Set<MyData>?

这是应用程序的行为:用户首先进入处于loading 状态的MyDataListViewControllerviewDidLoad 方法触发一个异步函数,假设我们为此使用Parse

static func loadDatas(success: ((Set<Data>) -> Void)?, error: ((String) -> Void)?) 
    // Here we fetch the datas and return then in the success or an error
    // ... 

回调结果填充控制器的UITableView,当点击一个单元格时,它会打开一个特定MyData 的模式弹出窗口,并带有一个按钮来更改其settled 值。

myData.settled = !myData.settled
myData.save()

鉴于此信息,

如何分离 UI 和单元测试? 我应该如何以及为每个测试设置什么?

感谢您阅读并帮助我,如果这听起来很初学者,再次抱歉。我对这个主题仍然很困惑。另外,很抱歉,如果有比 SO 更好的地方适合这类问题,我真的不知道该去哪里问。

【问题讨论】:

需要测试什么? 实际上我想测试几乎所有的东西:视图和模式视图的行为,对象被实际获取然后更新和保存...... 那么您认为哪些测试测试过于模糊和宽泛,这可能是您的一些困难的根源。测试要求您将内置的内容(Apple 的代码不需要测试,而且大多数情况下无法测试)与您正在做的事情分开,并将可测试的“事物”分成单独的单元。我将投票结束这个问题过于宽泛,我建议你观看关于这个主题(测试)的六个左右的 WWDC 视频中的任何一个或全部,因为它们比任何单一答案更好地解决这些问题这里可以。 我会这样做的。谢谢你的回答。 【参考方案1】:

您的具体问题的答案太长,无法提供 SO 答案。但是,您的根本问题之一似乎是单元测试和 UI 测试之间的区别是什么。 可以在这里回答。

真正简短的版本是,单元测试可以访问您的应用程序(或您正在构建的任何类型的模块)中的代码,而 UI 测试可以访问代码。

单元测试每个测试只测试一个类。类需要与之交互的任何对象都应替换为测试控制的假对象。如果您不插入假对象,您将无法知道失败的测试是来自您真正尝试测试的东西还是它使用的东西。 (应该注意的是,还有集成测试之类的东西,它可以测试功能而不会伪造网络响应之外的任何东西)。

对于单元测试,您希望为应用中的每个类都有一个测试用例类。然后每个测试用例可以专注于单个类并尽可能彻底地对其进行测试。

UI 测试利用 Apple 各种平台的辅助功能来有效地假装是使用该应用程序的用户。这个想法是你使用 Xcode 记录一系列动作来完成你的应用程序中的任务(可能添加一个待办事项),然后编辑 Xcode 为你生成的代码来测试特定的东西,比如 table view 现在有一个待办事项,该单元格是否包含正确的标题。

您需要使用 Xcode 的 UI 测试记录功能开始,因为代码一开始对您来说有点陌生。这是因为 UI 测试无权访问应用程序的代码,因此它无法请求出口,它必须找到具有可访问性的元素(如果您将可访问性标签添加到尽可能多的UI 元素)。

为了更深入地了解使用 Xcode 进行单元和 UI 测试,有一些博客文章和书籍:

博文

https://www.raywenderlich.com/709-ios-unit-testing-and-ui-testing-tutorial https://medium.com/flawless-app-stories/a-complete-list-of-articles-on-unit-testing-with-swift-from-2017-9be8f046ef25

书籍

https://www.packtpub.com/application-development/test-driven-ios-development-swift-4-third-edition(如果您有帐户,可在 Safari 上在线获取) https://www.hackingwithswift.com/store/testing-swift(目前仅预购)

我确信还有其他资源,但这些资源应该可以帮助您入门。 Ray Wenderlich 文章应该让您有一个很好的概述,并允许您为 Google 和 SO 制定更有针对性的问题。

【讨论】:

非常感谢您的出色回答。我要看看这些链接。【参考方案2】:

对于 UI 测试用户可以直接通过不同设备版本和操作系统的模拟器。这样他们就可以获得每个设备和版本的特定 UI。现在 UI 和功能一样重要。

单元测试需要涉及代码,并且需要通过相关 API 的正确响应来检查 API 的响应、代码集、任何直接崩溃、应用程序流。通常,开发人员负责单元测试,以便应用程序准备好进行测试。

【讨论】:

【参考方案3】:

单元与 UI 测试

[Test types]

他们每个人都可以实施性能测试。 UI 测试的主要优点是可以访问 UI 元素

应用程序。单元测试 和相应的 MyAppTests.xctest。如您所见,单元测试作为单独的模块添加到 Plugins 文件夹中。 App Extension[About]使用相同的方法

应用。使用 MyAppUITests-Runner 和 MyAppUITests.xctest 进行 UI 测试

框架。单元测试。

不能在真机上运行

Cannot test target “<target_name>” on “<device_name>”: Logic Testing Unavailable Logic Testing on iOS devices is not supported. You can run logic tests on the Simulator.

构建文件夹

框架。使用 MyFrameworkUITests-Runner 进行 UI 测试

【讨论】:

以上是关于iOS - 如何区分 UI 和单元测试,以及如何在这种具体情况下使用它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何在现有的 ios 测试项目中启用 xcode 7 UI 测试

如何提高UI自动化测试的质量

如何在 Xcode 中为 Apple Watch 添加单元测试?

单元测试不了解 XCTest 期望的异步 UI 代码?

iOS 中的 XCTest 和 UI 测试

iOS - 从发布版本中排除测试文件