2017-10-09 5 views
0

:엑스 코드 UI 테스트, 시나리오에 따라 개발 언어, 대체 번역 및 CI 서버

내가 자동으로 CI 서버 (CircleCI)의 모든 자식 푸시 테스트 장치와 UI를 취득하는 아이폰 OS 프로젝트를 보내고 있습니다. 테스트는 앱 스토어의 스크린 샷을 자동으로 생성하는 데 사용되는 패스트 레인으로 실행됩니다.

이제 프로젝트가 여러 언어로 번역됩니다. 나는 이것이 할 것입니다 생각

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

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

에 : 나는 추월 차선은 모든 언어 (스크린 샷을 할 수 있도록) 작업 할, 그래서 나는이 같은에서 UI 테스트를 변경 트릭,하지만 그렇지 않습니다. 나는 시뮬레이터가 CircleCI 구성하는 방법을 모르겠지만 UI 테스트는 이제 실패로

[0시 46분 34초] : ▸ testDashboard, 찾기 일치하는 항목이 발견되지 : " '네비게이션 바을 조건에 일치하는 요소. 언어가 번들의 preferredLanguages 목록에없는 아마 때문에, 입력 {(CFBundleDevelopmentRegion 설정 대체 언어가 존중되지 않는 몇 가지 이유 그래서

에서 " '식별자 IN 확인합니다.이 자체에 문제가 어떤 경우에도 최종 사용자에게 키가 표시되는 것을 원하지 않습니다. 결코 이런 일이 발생하지 않도록하고 싶습니다.

그래서 NSLocalizedString(..)이 키를 반환하는지 확인하고 기본 (en) 번들을로드하고 그런 식으로 현지화 된 문자열을 가져 오는 NSLocalizedString에 대한 래퍼를 작성하여이를 수정하려고했습니다.

UI 테스트에서 다른 번들을로드 할 수없는 것 같습니다. 테스트가 중단되고 실패합니다. 그래서이 해결 방법을 사용할 수 없습니다.

나는 명백한 해결책을 간과하고 있습니까? 나는이 문제가있는 유일한 사람이 될 수 없다, 그렇지? 어떤 힌트?

답변

1

현지화 된 문자열 값을 사용하는 대신 사용자 요소에 접근성 식별자를 설정하고 테스트에있는 접근성 식별자를 사용하여 쿼리합니다. 이렇게하면 테스트가 언어에 구애받지 않으며 여러 번들에 액세스 할 필요가 없습니다.

접근성 식별자를 설정하고 사용하는 방법에 대한 예제는 this answer을 참조하십시오.

+1

실제로 이것은 일을하는 데 더 나은 방법입니다. 나는 이것이 가능한지 궁금해했지만, 나는 식별자가 아닌 접근성 라벨을 우연히 발견했다. 공유해 주셔서 감사합니다. – JanBrinker

1

NSLocalizedString("navbar.confirm", comment: "")을 사용하면 시스템은 주 번들의 strings 파일에서 해당 키 값을 검색하려고 시도합니다.

UITest를 실행할 때 주 번들이 작동하지 않습니다. UITest가 UITest 번들 대신 UITest Runner App 번들을 제공하기 때문입니다. 당신의 Localizable.strings이 UITest 대상에

2. 액세스를 통해 파일을 파일을 추가

1 :

것은이 일을 할 수있는 UITest에 NSLocalizedString을 당신이 사용할 수 있도록

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

당신은 UITest 번들에 액세스 할 UITests에서 모든 클래스를 사용할 수 있습니다 : 번들 UITest (당신은 그것에 대해 약간의 도우미 방법을 사용할 수 있습니다).

지금 당신은이처럼 UITest에서 NSLocalizedString를 사용할 수 있습니다 당신은 자세한 내용에 관심이 있다면

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

나는, 얼마 전에 이것에 대해 약간의 blog post을 썼다.