Android UI 테스트 코드

15314 단어 AndroidJavaEspresso

Espresso 소개

  • 구글이 개발 중입니다.
  • 안드로이드의 UI 테스트 프레임워크
  • 자동 동기화(Automatic Synchronization)
  • 간단한 기본 조작(텍스트 입력, 클릭, 스크롤, 교환)
  • 원하는 동작을 제공하지 않으면 직접 만들 수 있다
  • 가져오기


    gradle에 다음 코드 추가
    최신 버전은 공식 사이트을 참조하십시오.
    dependencies {
        androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
    }
    

    새 로그인 화면의 프로세스 테스트


    id와 비밀번호를 입력하고 버튼을 누르면 다음 화면으로 전환하는 프로그램을 고려합니다.
    등록이 실패하면 오류 메시지가 표시됩니다.

    SignUp 실패 시 테스트

    @Test
    public void checkErrorMessage() {
        onView(withId(R.id.user_id)).perform(replaceText(""));
        onView(withId(R.id.password)).perform(replaceText(password), closeSoftKeyboard());
        onView(withId(R.id.signup_button)).perform(click());
        onView(withId(R.id.error_message)).check(matches(withText("ユーザーIDを入力してください。")));
    }
    

    SignUp 성공 시 테스트

    @Test
    public void checkSignUp() {
        onView(withId(R.id.user_id)).perform(replaceText(userId));
        onView(withId(R.id.password)).perform(replaceText(password), closeSoftKeyboard());
        onView(withId(R.id.signup_button)).perform(click());
        onView(withId(R.id.hello_world)).check(matches(withText("Hello World, " + userId + "!!")));
    }
    

    CustomMatcher


    방금 위의 withText는 화면의 텍스트 값을 검사했고, 스스로 맞춤형Matcher를 만들 수도 있습니다.
    예를 들어 TextView 색상을 검사하는 Custom Matcher를 실현하려면 matches Safely 방법과 describeTo 방법을 다시 써야 한다.
    matches Safely로 독자적인 Matcher를 정의하고 describeTo로 로그의 표시를 정의합니다.
    private static Matcher<Object> withColor(final Matcher<Integer> integerMatcher) {
        return new BoundedMatcher<Object, TextView>(TextView.class) {
            @Override
            public boolean matchesSafely(TextView textView) {
                return integerMatcher.matches(textView.getCurrentTextColor());
            }
    
            @Override
            public void describeTo(Description description) {
                description.appendText("with resource color : ");
                integerMatcher.describeTo(description);
            }
        };
    }
    
    onView(withId(R.id.error_message))
            .check(matches(withColor(is(ContextCompat.getColor(activity, android.R.color.holo_red_light)))));
    

    Idling Resource


    어떤 조건을 만족시킨 후 동작을 진행하다.
    애니메이션이 끝나면 스크롤이 시작됩니다.5초 후 버튼을 누릅니다.잠깐만요.
    implements 클래스에서 구현된 Idling Resource입니다.
    다음은 hoge초 후 동작 처리를 하는 상황입니다.
    public class ElapsedTimeIdlingResource implements IdlingResource {
        private final long startTime;
        private final long waitingTime;
        private IdlingResource.ResourceCallback resourceCallback;
    
        public ElapsedTimeIdlingResource(long waitingTime) {
            this.startTime = System.currentTimeMillis();
            this.waitingTime = waitingTime;
        }
    
        @Override
        public String getName() {
            return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime;
        }
    
        @Override
        public boolean isIdleNow() {
            long elapsed = System.currentTimeMillis() - startTime;
            boolean idle = (elapsed >= waitingTime);
            if (idle) {
                resourceCallback.onTransitionToIdle();
            }
            return idle;
        }
    
        @Override
        public void registerIdleTransitionCallback(IdlingResource.ResourceCallback resourceCallback) {
            this.resourceCallback = resourceCallback;
        }
    }
    
    
    @Test
    public void checkErrorMessage() {
        // Now we wait 8 seconds for some reason
        IdlingResource idlingResource = new ElapsedTimeIdlingResource(DateUtils.SECOND_IN_MILLIS * 8);
        Espresso.registerIdlingResources(idlingResource);
    
        onView(withId(R.id.error_message)).check(matches(withColor(is(ContextCompat.getColor(activity, android.R.color.holo_red_light)))));
    
        // Clean up
        Espresso.unregisterIdlingResources(idlingResource);
    }
    

    고찰하다.


    Espresso의 문법은 보기에 매우 간단하고 코드의 양도 매우 적으며 매우 좋다.
    이 기사의 코드는 GiitHub에 EspressoDemo라는 이름으로 공개됐으니 꼭 보십시오.
    말은 그렇지만 저는 개인적으로 안드로이드 앱MapMe과 넷플릭스의 영화 평론 사이트WhatchaSee를 운영하고 있습니다.
    한번 봐주시면 감사하겠습니다.

    좋은 웹페이지 즐겨찾기