launchArguments в UITesting в Xcode 7.3 не работает

Я писал тесты пользовательского интерфейса в Xcode 7.3 и недавно хотел добавить аргумент запуска, чтобы включить некоторый тестовый код внутри приложения. Сначала я попытался установить XCUIApplication().launchArguments, как это сделали несколько человек в разных сообщениях, но они не сработали.

Покопавшись, оказалось, что и launchArguments, и launchEnvironment нельзя настроить в тесте пользовательского интерфейса, хотя в документации API сказано, что они могут.

Кроме того, когда я попытался установить аргументы запуска и переменные среды в схеме тестирования пользовательского интерфейса, они также не были переданы в приложение, где, как при модульном тестировании или запуске приложения, они есть.

Вот копия быстрых тестов, которые я сделал, чтобы доказать это, все эти тесты терпят неудачу.

import XCTest

class LaunchDebugUITests: XCTestCase {

    func testLaunchArgumentsSetting() {
        XCUIApplication().launchArguments = ["abc"]
        print("Arguments \(XCUIApplication().launchArguments)")
        XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
    }

    func testLaunchArgumentsAppending() {
        XCUIApplication().launchArguments.append("abc")
        print("Arguments \(XCUIApplication().launchArguments)")
        XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
    }

    func testLaunchEnvironmentSetting() {
        XCUIApplication().launchEnvironment = ["abc":"def"]
        print("Environment \(XCUIApplication().launchEnvironment)")
        XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
    }

    func testLaunchEnvironmentAppending() {
        XCUIApplication().launchEnvironment["abc"] = "def"
        print("Environment \(XCUIApplication().launchEnvironment)")
        XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
    }

} 

кто-нибудь еще сталкивался с этим? У вас есть работа вокруг?


person drekka    schedule 12.04.2016    source источник


Ответы (2)


Затем вам также нужно запустить приложение и проверить в приложении наличие аргумента. Вот как я это делаю...

func testFooBar() {
    // given
    app.launchArguments = ["shouldDoBar", "shouldDoFoo"]

    // when
    app.launch()

    // then
}   

Затем в вашем приложении

int main(int argc, char *argv[]) {
    NSArray *arguments = [[NSProcessInfo processInfo] arguments];

    if ([arguments containsObject:@"shouldDoBar"]) {
       doBar();
    }

    if ([arguments containsObject:@"shouldDoFoo"]) {
       doFoo();
    }
    ...
}

Вы можете захотеть проверить аргументы где-нибудь более подходящим для вашего использования (и, возможно, также завернутым в #ifdef DEBUG ... #endif, чтобы избежать его отправки).

person Michael    schedule 12.04.2016
comment
Ага. Сделал все так, аргументы куда не прошли. Вот как я попал в этот баг в первую очередь. Я хотел установить аргумент в тесте, чтобы приложение обнаружило его и ответило. В моем случае, чтобы очистить пользовательские настройки по умолчанию. - person drekka; 13.04.2016
comment
Apple ответила мне, и ваш ответ правильный. Я дал более подробное объяснение ниже, так как в первый раз, когда я прочитал его, было неясно, почему это сработает. - person drekka; 14.04.2016

Apple ответила мне и сказала, что я неправильно использую XCUIApplication().

Вы не должны вызывать XCUIApplication() несколько раз.

Многие блоги, которые я читал, делали этот звонок несколько раз, и в большинстве случаев это не имеет значения. На самом деле, многие сообщения в блогах обрабатывают функцию так, как будто она обращается к синглтону. У меня было ощущение, что это неправильно, потому что это выглядело неправильно, но я полагал, что другие люди поняли бы это правильно.

Но это не так. Он не обращается к синглтону и фактически создает новый экземпляр XCUIApplication при каждом вызове. Следовательно, мой код не работал, потому что я устанавливал аргументы запуска для одного экземпляра, а затем создавал другой для запуска.

Итак, мои тесты должны были выглядеть так:

func testLaunchArgumentsSetting() {
    let app = XCUIApplication()
    app.launchArguments = ["abc"]
    print("Arguments \(app.launchArguments)")
    XCTAssertTrue(app.launchArguments.contains("abc"))
    app.launch()
}
person drekka    schedule 14.04.2016
comment
Спаситель! Делал ту же ошибку! Спасибо! - person JoriDor; 23.05.2016
comment
удар на! Ключевым моментом является запуск () локальной переменной, для которой были установлены параметры запуска. Это заставило меня часами скрежетать зубами. Этот блог спас положение: drekka.ghost.io/xcuiapplication-youre -вероятно-делает-это-неправильно - person Max MacLeod; 12.07.2016
comment
о боже, спасибо, проведите последние часы с этой проблемой - person schirrmacher; 17.07.2016
comment
Это, наконец, заставило мои снимки экрана быстрого доступа работать после 4 часов отладки. Наконец-то понял это, вручную изменив код SnapshotHelper.swift, чтобы распечатать аргументы, убедиться, что они установлены правильно, а затем понять, что аргументы не попадают в мое приложение. Фу. Благодарю вас! - person Robbie Trencheny; 24.06.2019