Как я reset данные приложения после каждого теста с тестированием интерфейса Xcode 7?
Apple представила новый тестовый интерфейс UI Test Xcode 7, но у меня есть борьба, когда тесты запускаются в приложении, и начинается с данных, которые ранее были в приложении. Это означает, что тесты не могут быть независимыми и на них могут влиять другие тесты.
Невозможно получить доступ к настройкам по умолчанию и другим данным, поскольку приложение, на котором выполняются тесты, не имеет доступа к набору тестируемого приложения. Сценарии также не могут быть рассмотрены, потому что их можно запустить до или после тестирования. И нет способа выполнить NSTask на iOS для запуска script перед каждым набором тестов.
Есть ли способ, как reset данные приложения перед каждым набором тестов?
Ответы
Ответ 1
Не в прямой форме. Но есть некоторые обходные пути.
XCUIApplication
может устанавливать аргументы командной строки и переменные среды, которые могут изменять поведение ваших приложений.
Простой пример вашего файла main.m
:
int main(int argc, char * argv[]) {
#if DEBUG
// Reset all data for UI Testing
@autoreleasepool {
for (int i = 1; i < argc; ++i) {
if (0 == strcmp("--reset-container", argv[i])) {
NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSFileManager *fm = [[NSFileManager alloc] init];
for (NSString *path in folders) {
[fm removeItemAtPath:path error:nil];
}
// Also remove documents folder if necessary...
}
}
}
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
}
}
И в -[XCTestCase setUp]
добавить:
XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];
Ответ 2
При подготовке приложения для UITests внутри application:didFinishLaunchingWithOptions:
в вашем случае будет нормально, вы можете сделать следующее:
В setUp()
метод вашего тестового класса, расширяющий XCTestCase
, добавьте следующий код:
let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()
Затем в application:didFinishLaunchingWithOptions:
вы можете проверить флаг, используя следующий код:
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
let env = ProcessInfo.processInfo.environment
if let uiTests = env["UITESTS"], uiTests == "1" {
// do anything you want
}
// further set up code
}
Конечно, если это вариант для вас.
ПРИМЕЧАНИЕ. Вместо того, чтобы устанавливать "1"
в качестве аргумента для флага "UITESTS"
, вы можете указать разные значения для разных тестовых случаев - или даже методы тестирования (но в этом случае вы должны запустить приложение из метода тестирования, а не setUp()
)
ПРИМЕЧАНИЕ 2. Я предлагаю обернуть код, связанный с флагом, в блок #if DEBUG
.
Ответ 3
Я получил reset данные приложения, используя некоторые закрытые заголовки для доступа к трамплину и настройкам.
Сначала я добавил фазу Run script, чтобы удалить ее при запуске тестов:
/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId
И после этого я использую решение, которое я написал здесь, чтобы удалить его с помощью теста script, который запускается при вызовах tearDown
на reset после каждый тест.
Ответ 4
В моем случае мне также необходимы разрешения reset. И есть возможность удалить ваше приложение и reset системные разрешения, просто сделав тест, удалив приложение и перейдите к настройкам.
Уже ответил в этом S.O. thread: Есть ли способ reset приложения между тестами в Swift XCTest UI в Xcode 7?