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

iOS - How to differentiate UI and Unit tests, and how to use them in this concrete situation?

我完全是 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()

鉴于此信息,

感谢您阅读我的文章并帮助我,如果这听起来很新手,再次抱歉。我对这个问题仍然很困惑。另外,抱歉,如果有比 SO 更好的地方来回答这类问题,我真的不知道去哪里问。

您的特定问题的答案太长,无法放入 SO 答案中。但是,您的根本问题之一似乎是单元测试和 UI 测试之间的区别。 可以在这里回答。

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

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

理想情况下,对于单元测试,您希望应用中的每个 class 都有一个测试用例 class。然后每个测试用例可以专注于单个 class 并尽可能全面地测试它。

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

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

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

博文

书籍

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

对于UI测试用户可以直接通过不同设备版本和OS的模拟器。这样他们就可以为每个设备和版本获得某些 UI。现在 UI 与功能一样重要。

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

单元对比UI测试

[Test types]

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

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

应用程序。 UI 使用 MyAppUITests-Runner 和 MyAppUITests.xctest

进行测试

框架。单元测试.

无法在真实设备上运行

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.

建立文件夹

框架。 UI 使用 MyFrameworkUITests-Runner

进行测试