此时,Xcode、Simulator 和 Swift Package Manager 提供的 public API 没有出现任何可从 setUp() 和 tearDown() XCText 子类调用到“Reset模拟器的“内容和设置”。
还有其他可能使用公共 API 的方法:
-
应用程序代码。添加一些myResetApplication() 应用程序代码以将应用程序置于已知状态。但是,设备(模拟器)状态控制受到应用程序沙箱的限制……这在应用程序之外没有太大帮助。这种方法对于清除应用程序可控持久性是可以的。
-
Shell 脚本。从 shell 脚本运行测试。在每次测试运行之间使用xcrun simctl erase all 或xcrun simctl uninstall <device> <app identifier> 或类似名称来重置模拟器(或卸载应用程序)。 see StackOverflow: "How can I reset the iOS Simulator from the command line?"
xcrun simctl --help
# Uninstall a single application
xcrun simctl uninstall --help
xcrun simctl uninstall <device> <app identifier>
# Erase a device's contents and settings.
xcrun simctl erase <device>
xcrun simctl erase all # all existing devices
# Grant, revoke, or reset privacy and permissions
simctl privacy <device> <action> <service> [<bundle identifier>]
-
Xcode 架构脚本动作。将
xcrun simctl erase all(或xcrun simctl erase <DEVICE_UUID>)或类似命令添加到Xcode Scheme 部分,例如Test 或Build 部分。选择产品 > 方案 > 编辑方案…菜单。展开方案测试部分。选择测试部分下的预操作。单击 (+) 添加“新运行脚本操作”。命令xcrun simctl erase all可以直接输入,不需要任何外部脚本。
调用的选项1。应用代码重置应用:
A. 应用程序界面。 [UI 测试] 提供重置按钮或其他用于重置应用程序的 UI 操作。 UI 元素可以通过XCUIApplication 在XCTest 例程setUp()、tearDown() 或testSomething() 中执行。
B. 启动参数。 [UI 测试] 正如 Victor Ronin 所指出的,可以从测试 setUp() 中传递一个参数 ...
class AppResetUITests: XCTestCase {
override func setUp() {
// ...
let app = XCUIApplication()
app.launchArguments = ["MY_UI_TEST_MODE"]
app.launch()
...由AppDelegate接收...
class AppDelegate: UIResponder, UIApplicationDelegate {
func application( …didFinishLaunchingWithOptions… ) -> Bool {
// ...
let args = ProcessInfo.processInfo.arguments
if args.contains("MY_UI_TEST_MODE") {
myResetApplication()
}
C. Xcode 方案参数。 [UI 测试,单元测试] 选择 Product > Scheme > Edit Scheme... 菜单。展开方案运行部分。 (+) 添加一些参数,如MY_UI_TEST_MODE。该参数将在ProcessInfo.processInfo 中提供。
// ... in application
let args = ProcessInfo.processInfo.arguments
if args.contains("MY_UI_TEST_MODE") {
myResetApplication()
}
D. 直接调用。 [单元测试] 单元测试包被注入到正在运行的应用程序中,可以直接调用应用程序中的一些myResetApplication() 例程。警告:默认单元测试在主屏幕加载后运行。 see Test Load Sequence 但是,UI 测试包作为被测应用程序外部的进程运行。因此,在单元测试中有效的方法在 UI 测试中会出现链接错误。
class AppResetUnitTests: XCTestCase {
override func setUp() {
// ... Unit Test: runs. UI Test: link error.
myResetApplication() // visible code implemented in application