【问题标题】:Are XCTest excuted in main thread and how?PYTest 是否在主线程中执行以及如何执行?
【发布时间】:2020-01-13 04:11:52
【问题描述】:

我正在编写一个支持 Core Data 的 iOS 应用。我先编写 Core Data 代码,然后直接在 AppDelegate 的方法中测试它们。在获得初始工作代码后,我决定将 Core Data 测试代码移至 XCTest。这是我第一次使用 XCTest,我认为测试是在与 iOS 应用程序不同的进程中运行的,但显然并非如此。例如,测试可以访问 app 设置的托管对象上下文。

所以我的问题是 XCTest 在哪个线程中运行?是主线程吗?我的实验似乎表明了这一点。例如,在主线程中创建的测试访问对象(例如,AppDelegate 实例)和 Xcode 不会抱怨它。如果是这样,我想知道谁安排测试在主线程中运行以及如何安排?

我在控制台中看到类似以下的日志,但它们并未指明底层详细信息。

2020-01-13 11:34:38.212244+0800 ... Launching with XCTest injected. Preparing to run tests.
2020-01-13 11:34:38.559808+0800 ... Waiting to run tests until the app finishes launching.

感谢您的帮助。

【问题讨论】:

    标签: ios xctest


    【解决方案1】:

    我认为测试是在与 iOS 应用程序不同的进程中运行的,但显然并非如此。例如,测试可以访问应用设置的托管对象上下文。

    测试以捆绑包的形式注入应用程序。反过来,测试将应用程序视为一个捆绑包;这就是您将应用程序导入测试的原因。 (这与 UITests 不同,其中应用程序在单独的应用程序运行器环境中运行。)

    所以我的问题是 XCTest 在哪个线程中运行?是主线程吗?我的实验似乎表明了这一点。例如,在主线程中创建的测试访问对象(例如,AppDelegate 实例)和 Xcode 不会抱怨它。如果是这样,我想知道谁安排测试在主线程中运行以及如何安排?

    一切都在主线程上运行。目前尚不清楚您对此有什么困难或惊喜会是什么。应用程序运行,它的代码运行,测试是其中的一些代码。

    【讨论】:

    • @mattt 感谢您的回复。我的困惑是 XCTest 如何在主线程中被调用(我的意思是,谁开始测试运行?)在主线程中执行的代码必须在 UI 初始化代码的直接或间接回调中(回调可能是一个不好的术语,但是希望你明白我的意思)。我看不到 XCTest 是如何从主线程中调用的。
    • 那么当你的表视图委托在主线程上被调用时谁调用它?
    • 对于委托,我认为它们是由委托对象的代码调用的。由于用户事件,委托对象方法被调用,这些事件由主线程中的事件循环分派。我就是这么理解的。我的问题是 XCTest 的调用是如何集成到这个机制中的。
    • 类似的方式。框架将测试安排在主线程上,并在启动结束和运行循环循环时运行。
    • 谢谢。那正是我所想。但如果没有我的实验和讨论,这对我来说并不明显。我很惊讶苹果文档中没有提到这一点。
    猜你喜欢
    • 2017-06-19
    • 2021-01-05
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多