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

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

提前致谢

【问题讨论】:

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

标签: xctest termination


【解决方案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()
    }
    

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

    【讨论】:

    • 您有任何解决方案,如果没有,请查看更新后的答案。如果是,请发布您的答案。
    猜你喜欢
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多