Android 는 Espresso 를 이용 하여 UI 자동화 테스트 를 진행 하 는 방법 에 대해 자세히 설명 합 니 다.

UI 자동화 테스트 가 왜 필요 합 니까?
저 는 반복 되 는 일 에 대해 절 차 는 모두 대체 할 수 있다 는 관점 이 있 습 니 다.이것 은 프로그래머 로 서 의 기본 적 인 소양 이 라 고 생각 합 니 다.UI 자동화 테스트 는 반복 되 는 작업 에 대처 하기 위해 서 입 니 다.예 를 들 어 특정한 기능 을 테스트 하기 위해 서 입 니 다.그러면 응용 클릭 을 한 다음 에 일련의 클릭 페이지 를 거 쳐 야 이 페이지 에 도착 할 수 있 습 니 다.그리고 테스트 를 할 수 있 습 니 다.그러면 우 리 는 코드 를 써 서 app 을 자동 으로 뛰 게 하고 자동 으로 그 인터페이스 에 와 서 테스트 할 수 있 습 니까?답 은 긍정 적 이다.이것 이 바로 본 고 에서 말 하고 자 하 는 자동화 테스트 이다.
머리말
구 글 은 2013 년 에 에 스프 레 스 를 시 작 했 는데 구 글 의 사고방식 은 충분히 성숙 하고 안 정 된 후에 안 드 로 이 드 SDK 로 옮 기 는 것 을 보면 그 에 대한 중 시 를 알 수 있다.구 글 은 G+,Maps,Drive 를 포함 한 30 개 이상 의 애플 리 케 이 션 을 Espresso 로 테스트 했다.
Espresso 테스트 는 매우 쉽게 이 루어 집 니 다.세 단계 로 구성 되 어 있 습 니 다.
  • ViewMachers:테스트 할 View 를 찾 습 니 다.
  • ViewActions:대화 이 벤트 를 보 냅 니 다.
  • ViewAssertions:검사 테스트 결과
  • 먼저 정부 가 준 예 시 를 보면 상기 세 가지 절 차 를 이해 할 수 있다.
    
    onView(withId(R.id.my_view)) // withId(R.id.my_view) is a ViewMatcher  
     .perform(click()) // click() is a ViewAction
     .check(matches(isDisplayed())); // matches(isDisplayed()) is a ViewAssertion
    에 스프 레 소 프레임 워 크 는 구 글 이 공식 적 으로 추천 하 는 테스트 프레임 워 크 이기 때문에 어떻게 든 배 워 야 합 니 다.또한 안 드 로 이 드 Studio 2.2 버 전부터 구 글 은 에 스프 레 소 프레임 워 크 에 그래 픽 인터페이스 를 내장 하여 유닛 테스트 코드 를 자동 으로 생 성 합 니 다.
    다음은 데모 테스트 를 써 서 에 스프 레 소 에 대해 깊이 알 아 보 겠 습 니 다.
    준비 하 다.
    Espresso 지원:
    
    dependencies {
     ...
     testCompile 'junit:junit:4.12'
     androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', {
     exclude group: 'com.android.support', module: 'support-annotations'
     }
    }
    dependencies 에 추 가 됩 니 다.일반적으로 기본적으로 testCompile'junit:junit:4.12'가 있 기 때문에 다른 한 마디 만 추가 하면 됩 니 다.
    
    defaultConfig{
     ...
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    default Config 에 위 와 같은 문 구 를 추가 하여 테스트 실행 을 지원 합 니 다.
    Test 클래스 만 들 기
    특히 이 종 류 는 androidTest 폴 더 아래 에 있어 야 합 니 다.
  • androidTest:Android 와 관련 된(예 를 들 어 Android 장치 호출 등)테스트 를 실시 합 니 다.
  • test:자바 SE 와 관련 된 간단 한 테스트 를 진행 합 니 다.
  • 간단 한 예 를 들다.
    
    @RunWith(AndroidJUnit4.class)
    @LargeTest
    public class MainActivityInstrumentationTest {
     @Rule
     public ActivityTestRule mActivityRule = new ActivityTestRule<>(
       MainActivity.class);
     @Test
     public void sayHello(){
      onView(withText("Say hello!")).perform(click());
      onView(withId(R.id.textView)).check(matches(withText("Hello, World!")));
     }
    }
  • 먼저 테스트 용례 류 의 클래스 앞 에@RunWith 의 주 해 를 추가 하고 테스트 실행 플랫폼 을 AndroidJUnit 4
  • 으로 설정 해 야 합 니 다.
  • 테스트 를 허용 하 는 데 큰 소모 가 필요 하 다 면@Largetest 주 해 를 사용 할 수 있 습 니 다
  • Activity TestRule 을 설정 하여 테스트 된 Activity 를 가리 키 고@Rule 주 해 를 사용 하여
  • 테스트 방법 은 test 로 시작 하고@Test 주 해 를 사용 해 야 합 니 다(그렇지 않 으 면 방법 이상 을 찾 을 수 없습니다)
  • @Rule
    
    @Rule
    public ActivityTestRule mTestRule = new ActivityTestRule<>(MainActivity.class);
    이 말 은 테스트 규칙 을 정의 합 니 다.구조 방법의 매개 변수 에 MainActivity.class 가 지정 되 어 있 습 니 다.구체 적 인 표현 은 이 테스트 코드 를 실행 할 때 app 은 MainActivity 인터페이스 를 직접 열 고 정 의 된 테스트 사례 를 진행 하 는 것 입 니 다.그래서 특정한 화면 을 직접 테스트 하고 싶 을 때 그 화면 을 이 매개 변수 에 채 워 서 지정 한 화면 을 열 어 테스트 할 수 있 습 니 다.
    @Test
    
    @Test
    public void testLogin() {
     ...
    }
    테스트 방법 을 정의 합 니 다.테스트 클래스 가 실 행 될 때 실 행 된 코드 는 Test 주해 의 방법 입 니 다.(Espresso 는 다른 주 해 를 제 공 했 습 니 다.예 를 들 어@After,@Before 등 구체 적 인 용법 은 제 가 위 에 쓴 android 홈 페이지 에서 볼 수 있 습 니 다)물론 위의 코드 에 대응 하 는 것 은 testLogin 테스트 방법 입 니 다.테스트 로그 인 방법 에서 정 의 된 것 은 테스트 할 내용 입 니 다.
    View Machers 찾기 View
    onView 방법 으로 view 를 찾 을 수 있 습 니 다.그 중에서 매개 변 수 는 withId(자원 id 를 통 해 찾 을 수 있 습 니 다)이 고 withText(내용 표시 로 찾 을 수 있 습 니 다)가 여러 개의 제약 조건 이 있 을 때 allOf 를 사용 할 수 있 습 니 다.  예 를 들 어 allOf(withText("Hello"),withId(R.id.hello))주의:
  • 은 withId()를 통 해 컨트롤 을 찾 든 withText() 을 통 해 컨트롤 을 찾 든 다른 방식,예 를 들 어 withClassName(),withResourceName(),withTagKey() 등 방법 을 통 해 찾 는 컨트롤 이 현재 페이지 에 확실히 존재 하고 볼 수 있 도록 해 야 합 니 다.
  • AdapterView,예 를 들 어 ListView 나 GridView 등 을 테스트 하려 면 위의 onView() 방법 을 사용 하 는 것 은 무효 입 니 다.AdapterView 의 레이아웃 item 은 동태 적 으로 나타 나 서 직접 지정 할 수 없 기 때문에 AdapterView 를 테스트 하려 면 onView() 방법 을 onData() 방법 으로 바 꾸 십시오.onView() 방법 과 ViewInteraction 으로 돌아 가 는 것 과 유사 합 니 다.onData() 방법 은 DataInteraction 으로 돌아 가 는데 이들 의 용법 은 대체적으로 같다.
  • ViewActions 실행 이벤트
    View 조작:perform() 방법  방식 은 onView(...).perform().하나의 perform 에서 perform(click(),clearText()) 과 같은 여러 작업 을 수행 할 수 있 습 니 다.
    모든 조작 에는 하나의 전제 가 있다.즉,실행 하려 는 view 는 현재 인터페이스 에 표시 되 어야 한다(있 고 볼 수 있다).
    방법
    속뜻
    click()
    클릭 하여 보기
    clearText()
    텍스트 내용 지우 기
    swipeLeft()
    오른쪽 에서 왼쪽으로 미끄러지다
    swipeRight()
    왼쪽 에서 오른쪽으로 미끄러지다
    swipeDown()
    위 에서 아래로 내려가다
    swipeUp()
    아래 에서 위로 미끄러지다
    click()
    클릭 하여 보기
    closeSoftKeyboard()
    소프트 키보드 닫 기
    pressBack()
    물리 반환 키 를 누르다
    doubleClick()
    더 블 클릭
    longClick()
    길 게 누르다
    scrollTo()
    굴러가다
    replaceText()
    텍스트 바 꾸 기
    openLinkWithText()
    지정 한 하이퍼링크 열기
    View Assertions 검사 결과
    check()방법 을 사용 하여 View 가 우리 의 기대 에 부합 되 는 지 확인 합 니 다.onView(...).check() view 에 텍스트 “hello”              check(matches(withText("hello"))) 이 있 는 지 확인 합 니 다.
    제 가 쓴 예 를 보 겠 습 니 다.
    저 희 는 기본적으로 모든 app 에 로그 인 기능 이 있 습 니 다.사용자 이름과 비밀 번 호 를 불 러 야 합 니 다.로그 인 을 누 르 기 전에 사용자 이름과 비밀 번 호 를 비 어 있 거나 형식 등 검증 해 야 합 니 다.
    다음 예제 에서 로그 인 단 추 를 누 르 면 먼저 입력 한 사용자 이름과 비밀 번 호 를 검증 합 니 다.인증 은 TextView 에 해당 하 는 원인 을 표시 하지 않 고 인증 에 문제 가 없 으 면'로그 인 성공'을 표시 합 니 다.
    Activity 인터페이스 및 논리
    
     @Override
     public void onClick(View view) {
      if (view.getId() == R.id.bt_login) {
       login();
      }
     }
     /**
      *    
      */
     private void login() {
      String name = et_name.getText().toString().trim();
      String pwd = et_pwd.getText().toString().trim();
      if (TextUtils.isEmpty(name)) {
       tv_login_result.setText("     ");
       return;
      }
      if (name.length() < 6 ) {
       tv_login_result.setText("       ");
       return;
      }
      if (TextUtils.isEmpty(pwd)) {
       tv_login_result.setText("    ");
       return;
      }
      if (pwd.length() < 6 ) {
       tv_login_result.setText("      ");
       return;
      }
      tv_login_result.setText("    ");
     }
    기타 코드 무시.
    
    @RunWith(AndroidJUnit4.class)
    @LargeTest
    public class MainActivityTest {
     private String[] names = {"", "a", "123123"};
     private String[] pwds = {"", "a", "123123"};
     @Rule
     public ActivityTestRule mTestRule = new ActivityTestRule<>(MainActivity.class);
     @Before
     public void init() {
      Log.e("TAG", "init: ");
     }
     @Test
     public void testLogin() {
      //       ,      
      onView(allOf(withId(R.id.bt_login), isDisplayed())).perform(click());
      onView(allOf(withId(R.id.tv_login_result), isDisplayed())).check(matches(withText("     ")));
      //      ,    
      onView(allOf(withId(R.id.et_name), isDisplayed())).perform(replaceText(names[0]), closeSoftKeyboard());
      onView(allOf(withId(R.id.bt_login), isDisplayed())).perform(click());
      onView(allOf(withId(R.id.tv_login_result), isDisplayed())).check(matches(withText("     ")));
      //        ,    
      onView(allOf(withId(R.id.et_name), isDisplayed())).perform(replaceText(names[1]), closeSoftKeyboard());
      onView(allOf(withId(R.id.bt_login), isDisplayed())).perform(click());
      onView(allOf(withId(R.id.tv_login_result), isDisplayed())).check(matches(withText("       ")));
      //          ,    
      onView(allOf(withId(R.id.et_name), isDisplayed())).perform(replaceText(names[2]), closeSoftKeyboard());
      onView(allOf(withId(R.id.et_pwd), isDisplayed())).perform(replaceText(pwds[2]), closeSoftKeyboard());
      onView(allOf(withId(R.id.bt_login), isDisplayed())).perform(click());
      onView(allOf(withId(R.id.tv_login_result), isDisplayed())).check(matches(withText("    ")));
     }
    }
    여기 서 저 희 는 테스트 데 이 터 를 미리 정 의 했 습 니 다.Espresso 를 사용 하여 여러 가지 상황 을 모 의 입력 과 클릭 을 하여 저희 가 기대 하 는 바 에 부합 되 는 지 테스트 합 니 다.

    에 스프 레 소 에 대한 소 개 는 아마 이 정도 일 것 이 니 많은 조언 과 함께 발전 해 주시 기 바 랍 니 다.
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기