具有 Xcode UI 测试的应用程序状态/测试夹具

Application State / Test Fixtures with Xcode UI Tests

任何类型的集成测试的一个非常普遍的问题是让被测单元进入已知状态——为您要执行的测试设置良好的状态。对于单元测试,通常没有太多状态,唯一的问题是可能模拟与其他 类.

的交互

另一方面,在测试整个应用程序时,存在各种潜在的持久状态,并使应用程序进入干净状态,或者更棘手的是,进入一个已知状态,而不是 "clean"对应用程序本身的任何访问都有些棘手。

我发现的唯一建议是在应用程序中嵌入任何必要的设置,并使用环境变量之类的东西来触发设置。这当然是可行的,但并不理想。如果可以避免,我真的不想在我的最终应用程序中嵌入测试代码和测试数据。

然后是模拟与远程服务的交互。同样,您可以嵌入代码(甚至框架)来执行此操作,并使用环境变量触发它,但我还是不喜欢将存根代码嵌入最终应用程序的想法。

建议?我找不到太多,这让我想知道是否没有人在使用 Xcode UI 测试,或者只将它用于没有这些问题的非常简单的应用程序.

不幸的是,您提到的两个建议是 Xcode UI 在当前状态下测试的唯一可能的建议。

但是,您可以做一件事来降低在生产应用程序中嵌入测试代码的风险。在 few compiler flags 的帮助下,您可以确保仅在 运行 在模拟器上构建特定代码。

#if (arch(i386) || arch(x86_64)) && os(iOS)
    class SeededHTTPClient: HTTPClientProtocol {
        /// ... //
    }
#endif

我正在构建一些东西来使这更容易一些。当它可以使用时我会报告。

关于在目标应用上设置状态,有一个解决方案。测试运行器应用程序和您的应用程序都可以读取和写入模拟器 /Library/Caches 文件夹。知道您可以在测试包中捆绑夹具数据,将其复制到 setUp() 上的 /Library/Caches 并将启动参数传递给您的应用程序以使用该夹具数据。

这只需要对您的应用进行最少的更改。您只需要准备它在启动时处理此参数并将所有内容复制到您的应用程序容器中。

如果您想了解更多相关信息,或者在设备上 运行 时如何做同样的事情,我实际上已经写了 post on it.

关于将您的 UI 测试与网络隔离,我认为最好的解决方案是在您的测试包中嵌入一个网络服务器并让您的应用程序连接到它(同样,您可以使用启动参数参数化您的应用程序)。您可以为此使用 Embassy