Chromium Chronicle #21: ChromeOS 엔드 투 엔드 UI 자동화

에피소드 21: 작성자: 브렌든 한스크네흐트, 캘리포니아주 마운틴 뷰 (2021년 5월)
이전 에피소드

이전에는 전체 기기의 엔드 투 엔드 (E2E) 테스트에서 ChromeOS UI를 자동화하기가 어려웠습니다. Tast에서는 Chrome a11y (접근성) 트리를 사용하여 ChromeOS UI를 제어하는 새로운 UI 라이브러리를 만들었습니다. 이 라이브러리를 사용하면 개발자는 표시되는 모든 UI 노출 영역 (ChromeOS 데스크톱 UI, 네이티브 앱, 웹 앱, Chrome 브라우저 UI)에 관한 E2E 테스트를 쉽게 만들 수 있습니다.

라이브러리에는 UI 요소를 찾는 방법을 설명하는 간단하고 체이닝 가능한 방법이 있습니다. 예를 들어 Files 앱의 Downloads 폴더는 다음과 같이 정의할 수 있습니다.

filesWindow := nodewith.NameStartingWith("Files")
  .ClassName("RootView").Role(role.Window)
downloadsButton := nodewith.Name("Downloads")
  .Role(role.TreeItem).Ancestor(filesWindow)

노드 파인더를 정의한 후에는 다양한 방식으로 노드와 상호작용할 수 있습니다. 간단한 클릭에서 포커스 대기에 이르기까지 UI 라이브러리를 사용하면 다양한 작업에 안정적으로 액세스할 수 있습니다. 예를 들어 Downloads 폴더를 마우스 오른쪽 버튼으로 클릭하고 복사 버튼을 마우스 왼쪽 버튼으로 클릭하면 다음과 같이 작성할 수 있습니다.

ui := uiauto.New(tconn)
if err := uiauto.Combine("copy downloads",
  ui.RightClick(downloadsButton),
  ui.LeftClick(nodewith.Name("Copy").Role(role.MenuItem)),
)(ctx); err != nil { /* do error handling */ }

공통 UI 영역 주변의 래퍼 (설정, 런처, 파일 앱 등)가 있습니다.

위에서 사용된 uiauto.Run 함수는 작업 목록을 가져옵니다. 이 컨텍스트에서 작업은 단지 func(context.Context) error입니다. 이렇게 간단한 API를 사용하면 다른 종류의 작업을 UI 작업과 혼합할 수 있습니다. 예를 들어 다음과 같이 쉽게 키보드를 사용할 수 있습니다.

if err := uiauto.Combine("do some random stuff",
  ui.FocusAndWait( /* some text field */ ),
  kb.TypeAction("Hello, world!"),
  kb.AccelAction("Enter"),
  func(ctx context.Context) error {
    // My custom action!
  },
)(ctx); err != nil { /* do error handling */ }

자세한 내용은 Tast Codelab: Chrome UI 자동화를 참고하세요.

이러한 테스트를 작성할 때는 디버깅을 위해 Chrome a11y 트리를 덤프하는 것이 매우 유용합니다. 다음 코드를 추가하기만 하면 됩니다.

defer faillog.DumpUITreeOnError(ctx, s.OutDir(), s.HasError, tconn)
s.Fatal("I would like to see the ui tree here")

이제 a11y 트리가 다른 tast 로그와 함께 faillog/ui_tree.txt로 저장됩니다.

궁금한 점이 있으면 tast-users 그룹에 문의하세요.