내 바운티 질문에 답하는 것이 조금 어색하지만 여기는 ...
나는 이것에 대해 높고 낮은 것을 검색했으며 어디에도 게시 된 답변이 없다는 것을 믿을 수 없습니다. 나는 아주 가까이 왔습니다. 지금은 활동에 걸친 테스트를 확실히 실행할 수 있지만, 제 구현에는 테스트가 항상 안정적으로 통과되지 않는 몇 가지 타이밍 문제가있는 것 같습니다. 이것은 여러 활동에서 성공적으로 테스트한다는 것을 알고있는 유일한 예입니다. 내 추출 및 익명화로 인해 오류가 발생하지 않았기를 바랍니다. 이것은 로그인 활동에 사용자 이름과 비밀번호를 입력 한 다음 다른 "환영"활동에 적절한 환영 메시지가 표시되는 것을 관찰하는 간단한 테스트입니다.
package com.mycompany;
import android.app.*;
import android.content.*;
import android.test.*;
import android.test.suitebuilder.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;
import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsNull.*;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
import static com.mycompany.R.id.*;
public class LoginTests extends InstrumentationTestCase {
@MediumTest
public void testAValidUserCanLogIn() {
Instrumentation instrumentation = getInstrumentation();
Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
instrumentation.startActivitySync(intent);
Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));
View currentView = currentActivity.findViewById(username_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyUsername");
currentView = currentActivity.findViewById(password_field);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(EditText.class));
TouchUtils.clickView(this, currentView);
instrumentation.sendStringSync("MyPassword");
instrumentation.removeMonitor(monitor);
monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);
currentView = currentActivity.findViewById(login_button;
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(Button.class));
TouchUtils.clickView(this, currentView);
currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
assertThat(currentActivity, is(notNullValue()));
currentView = currentActivity.findViewById(welcome_message);
assertThat(currentView, is(notNullValue()));
assertThat(currentView, instanceOf(TextView.class));
assertThat(((TextView)currentView).getText().toString(), is("Welcome, MyUsername!"));
}
}
이 코드는 분명히 읽기 어렵습니다. 실제로 영어와 유사한 API를 사용하여 간단한 라이브러리로 추출 했으므로 다음과 같이 말할 수 있습니다.
type("myUsername").intoThe(username_field);
click(login_button);
나는 약 4 개의 활동을 깊이 테스트했고 내가 말했듯이 접근 방식이 효과가 있다는 것에 만족한다. 가끔 내가 완전히 파악하지 못한 타이밍 문제가있는 것 같다. 활동 전반에 걸친 다른 테스트 방법에 대해 듣고 싶습니다.