AW212: 안드로이드 테스트 개요 및 사례, 데이터 바인딩

Android Weekly는 매주 발행되는 안드로이드 뉴스레터입니다. 영어 기사를 정독할 시간이 없는 분을 위해 핵심 꼭지를 요약했습니다.

주간 안드로이드 뉴스를 요약해 드립니다. Android Weekly 212 원문도 읽어보세요.


안드로이드 테스트 개요

많은 개발자 분들이 안드로이드 앱 개발에서 테스트의 필요성과 그 중요성에 많이 공감하실 겁니다. 만약 아직 테스트를 적용해본 적 없으시거나, 낯설게 느껴지시는 분들이 계시다면 마침 딱! 도움이 될만한 글이 있어 소개해 드립니다. 실제 UI test사례도 이어집니다.

  • 테스트를 왜 해야 하나요?
    • 테스트 하는 것은 개발자인 여러분이 다르게 생각할 수 있는 기회이기도하며 암묵적으로는 코드를 더 깔끔히 생산할 수 있게끔 기능합니다.
    • 테스트를 거치면 개발자는 코드에 더 자신감을 가질 수 있습니다.
    • 빛나는 초록생 상태바와 리포트의 상세 내용은 테스트 보고자료가 됩니다.
    • 자동화 테스트에서 버그를 먼저 잡아내기에 리그레션 테스트를 쉽게 할 수 있습니다. 이 중 리그레션 테스트가 가장 큰 장점을 갖는 부분으로, 여러분이 코드를 리팩토링하고 다시 테스트를 패스했을때 자신감 상승은 당연한 일이겠죠?! 테스트와 관련된 문제가 있다면 테스트를 한 즉시 그 효과를 확인할 수 있다기 보다 아무래도 몇 달(;)은 지나고 리팩토링이 필요해져야 알 수 있다는 점입니다…
  • 안드로이드 테스트 종류
  • 자동화 테스트(automated testing)를 하기 위해 뭐가 필요한가요?
    • 특정 패턴의 아키텍쳐를 따라야 합니다.
    • 예를 들면 뷰를 위해 MVP패턴을, 네트워킹과 데이터 접근을 위해 Repository패턴을 구현해 테스트할 수 있는 구조를 갖추는 것입니다.
  • 테스트가능한 방식으로 앱 구조 갖추기 아래 그림과 같은 구조를 기반으로 이후 시리즈에서 테스팅을 설명합니다.
    • 뷰(Views) : 액티비티, 프래그먼트에 해당하는 부분으로 UI변화가 생기는 부분입니다. 중요한 점은 오직 뷰만이 프레젠터에 말을 걸 수 있습니다.
    • 프레젠터(Presenters) : 무엇을 보여줄 것인지에 대한 비지니스 로직을 담는 부분입니다. 레파지토리에서 정보를 요청하거나 뷰에 정보를 전달합니다. 유닛테스트가 까다로워지지 않게 하려면 가능한 안드로이드 상세 코드를 프레젠터에 넣지 마세요!
    • 레파지토리(Repositories) : 데이터가 로컬에서 가져와야 하는지 또는 네트워크에서 가져와야하는지 결정하는 과정에서 프레젠터와 소통합니다.
    • 모델(Model) : 프레젠터로부터 뷰에 정보를 전달하기 위해 사용되는 모델로 전형적인 POJO입니다.
  • 자동화 테스트가 어딨죠?? 안드로이드 앱 폴더 구조를 보면 testandroidTest폴더를 볼 수 있습니다.
    • androidTest : Android Instrumentation 테스트로 안드로이드 에뮬레이터나 실물 디바이스에서 테스트를 수행할 수 있습니다.
    • test/ : 유닛 테스트가 위치하는 곳으로 여러분의 로컬 머신의 JVM에서 수행되며 에뮬레이터나 실물 디바이스에서 돌릴 수 없습니다. 즉, 이 테스트로는 Context와 같은 안드로이드 클래스에 접근할 수 없습니다.

이런 개발 뉴스를 더 만나보세요

시리즈 첫번째 글인 자동화 안드로이드 테스트 소개 - 그 첫번째 이야기(Introduction to Automated Android Testing – Part 1)에서는 위와 같이 테스트의 종류와 위치를 확인했습니다. 이어지는 글에서는 더 나은 유닛테스트를 위한 코드 구조 내용을 다룰 예정이라고 하니 관심있는 분들 잠시 기다려주세요!

데이터 바인딩 활용하기

지난 글 중에 findViewById 이제 그만! (원문)에서 findViewById를 대체할 수 있는 데이터 바인딩 방법을 소개해드린적 있습니다. 당시에는 하나의 레이아웃에 대해 다뤘는데요, 이번에 추가로 다른 레이아웃을 포함하고 있을 때 어떻게 사용할 수 있는지 추가 글이 올라왔습니다.

  • 데이터 바인딩과 include 예를 들어 어떤 레이아웃이 아래와 같을 경우, 각 TextView에 접근하는 방법은 어떻게 될까요?
//hello_world.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

        <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <include
                android:id="@+id/included"
                layout="@layout/included_layout"/>
    </LinearLayout>
</layout>
//included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/world"/>
</layout>
HelloWorldBinding binding =
    HelloWorldBinding.inflate(getLayoutInflater());
binding.hello.setText(Hello);
binding.included.world.setText(World);

바로 위와 같이 접근하실 수 있습니다.

  • include가 여러개 일 경우 include로 동일한 레이아웃을 여러번 반복해 사용해도 물론 데이터 바인딩으로 접근할 수 있습니다. 바로 각각의 id를 부여해주는 것이죠.
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

        <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <include
                android:id="@+id/world1"
                layout="@layout/included_layout"/>
        <include
                android:id="@+id/world2"
                layout="@layout/included_layout"/>
    </LinearLayout>
</layout>
HelloWorldBinding binding =
    HelloWorldBinding.inflate(getLayoutInflater());
binding.hello.setText(Hello);
binding.world1.world.setText(First World);
binding.world2.world.setText(Second World);

이렇게 각각 include된 레이아웃 안의 뷰에 접근하실 수 있습니다. 자세한 내용은 안드로이드 데이터 바인딩: include의 경우 (Android Data Binding: That include Thing)를 참고하세요.

오픈소스 라이브러리

compile 'net.zetetic:android-database-sqlcipher:3.5.1@aar'
  • demo.sh 마쉬멜로 이상에서 ADB를 통해 데모모드를 실행할 수 있는 bash 스크립트입니다.

  • android-architecture TODO-MVP-Loaders의 샘플 및 컨텐트 프로바이더를 이용해 데이터를 추출해 리파지토리로 보내는 것을 기반으로 안드로이드 앱에 적용할 수 있는 다양한 도구와 패턴 샘플을 확인해볼 수 있는 컬렉션을 제공합니다.

더 읽을 거리

7월 첫째 주의 기사를 Android Weekly 212 영어 원문에서 볼 수 있습니다.

지난 뉴스가 궁금하다면 아래 링크를 참고해 주세요.

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.


Realm Korea

Realm Korea Team

4 design patterns for a RESTless mobile integration »

close