Тесты пользовательского интерфейса Xcode, язык разработки, резервный перевод и серверы CI

Следующий сценарий:

У меня есть проект iOS, который автоматически тестирует модуль и пользовательский интерфейс при каждом нажатии git на сервере CI (CircleCI). Тесты выполняются с помощью Fastlane, который также используется для автоматического создания скриншотов для App Store.

Теперь мой проект переведен на несколько языков. Я хочу, чтобы fastlane работал на всех языках (чтобы можно было делать скриншоты), поэтому я изменил тесты пользовательского интерфейса примерно так:

app.navigationBars.buttons["Confirm"].tap()

to

let buttonTitle = NSLocalizedString("navbar.confirm", comment: "")   
app.navigationBars.buttons[buttonTitle].tap()

Я думал, что это поможет, но это не так. Я не знаю, как настроен симулятор в CircleCI, но тесты пользовательского интерфейса теперь не работают с

[00:46:34]: ▸ testDashboard, Не найдено совпадений для поиска: Элементы, соответствующие предикату '"navbar.confirm" IN идентификаторы' из ввода {(

Поэтому по какой-то причине резервный язык, установленный с помощью CFBundleDevelopmentRegion, не соблюдается, вероятно, потому, что язык не находится в списке preferredLanguages пакета. Это проблема сама по себе, так как я не хочу, чтобы ключи отображались для конечных пользователей в любом случае. Я хочу убедиться, что этого никогда не произойдет.

Поэтому я попытался исправить это, в свою очередь, написав оболочку для NSLocalizedString, которая проверяет, возвращает ли NSLocalizedString(..) ключ, и если да, загружает пакет по умолчанию (en) и таким образом локализует строку.

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

Я просто пропускаю какое-то очевидное решение? Я не могу быть единственным, у кого есть эта проблема, верно? Любые подсказки?


person JanBrinker    schedule 09.10.2017    source источник


Ответы (2)


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

См. этот ответ для примера того, как установить и использовать идентификаторы доступности.

person Oletha    schedule 10.10.2017
comment
На самом деле это лучший подход к ведению дел. Мне было интересно, возможно ли это, но я наткнулся только на метку доступности, а не на идентификатор. Спасибо, что поделился! - person JanBrinker; 11.10.2017

Когда вы используете NSLocalizedString("navbar.confirm", comment: ""), система пытается получить значение для этого ключа из файла строк в основном пакете.

Основной пакет не работает при запуске UITests, потому что он дает вам пакет приложения UITest Runner вместо пакета UITest.

Чтобы иметь возможность использовать NSLocalizedString в UITest, вам нужно сделать 2 вещи:

<сильный>1. Добавьте файл Localizable.strings в цель UITest.

<сильный>2. Доступ к файлу через пакет UITest (для этого можно использовать небольшой вспомогательный метод):

func localized(_ key: String) -> String {
    let uiTestBundle = Bundle(for: AClassFromYourUITests.self)
    return NSLocalizedString(key, bundle: uiTestBundle, comment: "")
}

Вы можете использовать любой класс из ваших UITests для доступа к пакету UITest.

Теперь вы можете использовать NSLocalizedString в своем UITest следующим образом:

app.navigationBars.buttons[localized("navbar.confirm")].tap()

Я написал небольшой блог опубликуйте об этом некоторое время назад, если вы заинтересованы в более подробной информации.

person joern    schedule 09.10.2017