在 XCTest 中的每个测试用例之后停止应用程序终止

Posted

技术标签:

【中文标题】在 XCTest 中的每个测试用例之后停止应用程序终止【英文标题】:Stop app termination after each test case in XCTest 【发布时间】:2016-11-18 12:47:29 【问题描述】:

我是 XCTest 的新手,我的应用程序有一个小示例项目,其中有 10 个测试用例,每个测试用例相互依赖我在这里面临的问题是,如果我在每个测试用例之后运行我的测试套件,我的应用程序是终止并调用下一个方法,我不希望它关闭应用程序,但它必须从测试用例完成的同一个地方继续

提前致谢

【问题讨论】:

我的问题实际上是不同的,我在 android 中有一个应用程序在 iPhone 中有一个应用程序,例如从 android 设备我将发送“HI”消息,我想检查它是否在 iPhone 中收到并虎钳反之亦然,所以作为示例状态,我必须在 2 个设备之间切换,所以我需要应用程序处于其初始状态和功能以不同的方法进行划分 我不明白您的评论与您的​​问题有什么关系。我建议您编辑您的问题并尝试尽可能准确地表述它。 【参考方案1】:

测试应该相互独立。请记住,Xcode 测试运行顺序的算法可能随时更改。拥有相互依赖的测试是一个脆弱的系统,因为如果一个测试失败,很可能下一个测试的状态将是错误的,并且所有后续测试都将失败,从而提供错误的负面反馈。

如果您必须让测试相互依赖,只需将所有代码放入包含多个断言的单个测试中即可。您可能希望将 continueAfterFailure 设置为 true。

【讨论】:

【参考方案2】:

这是一个坏主意,只启动一次应用程序来执行测试用例,因为在 xcode ui 测试中测试用例的顺序是未知的。

但是,如果您非常想要它,这就是解决方案。在 swift 2.2 和 2.3 中,我使用

dispatch_once 

针对这种需求。

在你的测试用例类中,我认为你使用了

XCUIApplication.launch() method in  setUp() method.

你必须在这里使用 dispatch_once() 。如果您将此 dispatch_once 用于 XCUIApplication.launch(),则只会启动应用程序一次。

这里是 swift 2.2 和 2.3 的解决方案:

 private static var launchAppOnce: () = 
    let app = XCUIApplication()
    app.launch()
    //do some code if you needed after launch app before run test cases.
()

struct Static 
    static var dispatchOnceToken: Int = 0


override func setUp() 
    super.setUp()
    continueAfterFailure = false
      _ = urclassname.launchAppOnce


override func tearDown() 
    super.tearDown()

在您的测试用例类中使用上述代码。 这将只启动应用一次,并从它完成先前测试用例的位置开始下一个测试用例。

【讨论】:

您有任何解决方案,如果没有,请查看更新后的答案。如果是,请发布您的答案。

以上是关于在 XCTest 中的每个测试用例之后停止应用程序终止的主要内容,如果未能解决你的问题,请参考以下文章

XCTest 显示已删除测试的结果

是否可以在 IOS 的 XCTest 单元测试用例中模拟方法(带参数)调用

如何从 XCTest 中的 UI 目标调用主目标中的方法?

如何在 XCTest 中运行“单个测试用例”?

如何在 Xcode 中配置和运行目标 C 测试用例--XCTest

使用 XCTest 在 Objective-C 静态库中创建测试用例