在 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 中的每个测试用例之后停止应用程序终止的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 IOS 的 XCTest 单元测试用例中模拟方法(带参数)调用