안 드 로 이 드 스튜디오 의 유닛 테스트 에 대해 간단히 이야기 합 니 다.
사실 제 목적 은 간단 합 니 다.보 기 를 조작 하지 않 는 전제 에서 activity 의 생명 주 기 를 테스트 하거나 네트워크 에서 데 이 터 를 끌 어 내 는 처리,예 를 들 어 json 데 이 터 를 분석 하고 네트워크 요청 을 하 는 등 모델 층 에 대한 테스트 입 니 다.이것 은 보 기 를 조작 할 필요 가 없 지만 유닛 테스트 환경 이 없 는 상황 에서 예 를 들 어 우리 네트워크 에서 데 이 터 를 요청 합 니 다.Log 인쇄 는 성공 여 부 를 보 려 고 하지만 시 뮬 레이 터 나 실제 컴퓨터 를 이용 하여 프로젝트 를 실행 하 는 데 몇 분 이 걸 립 니 다.이것 은 용납 할 수 없습니다.
그래서 강력 한 안 드 로 이 드 스튜디오 도 이 점 을 고려 하여 우리 에 게 제공 하 는 간단 한 유닛 테스트 류 입 니 다.
우리 간단하게 알 아 보고 공부 합 시다.
먼저 이름 을 알 아 보고 아래 에 소개 하고 사용 하기에 편리 합 니 다.
자바 에서 우 리 는 JUnit 의 유닛 테스트 를 사용 한 적 이 있 습 니 다.안 드 로 이 드 도 자바 언어 를 바탕 으로 작 성 된 것 이기 때문에 JUnit 의 유닛 테스트 도 있 습 니 다.안 드 로 이 드 유닛 테스트 를 하려 면 의존 도 를 가 져 와 야 합 니 다:
androidTestCompile 'junit:junit:4.12'
testCompile 'junit:junit:4.12'
그 중에서 test 디 렉 터 리 는 이 컴퓨터 에서 유닛 테스트 코드 를 실행 하 는 디 렉 터 리 이 고 안 드 로 이 드 Test 는 안 드 로 이 드 장치 에서 유닛 테스트 코드 를 실행 하 는 디 렉 터 리 입 니 다.다음 그림:안 드 로 이 드 가 자체 적 으로 가지 고 있 는 준 it 유닛 테스트 의 일부 테스트 클래스(안 드 로 이 드 테스트 는 아 날로 그 나 실제 컴퓨터 에서 실행 해 야 합 니 다)
1.InstrumentationTestCase 프레임 워 크:
Instrumentation 과 Activity 는 약간 유사 합 니 다.다만 Activity 는 하나의 인터페이스 가 필요 합 니 다.Instrumentation 은 그렇지 않 습 니 다.우 리 는 이 를 그래 픽 인터페이스 가 없고 작 동 능력 이 있 으 며 다른 유형(Target Package 로 설명)을 감시 하 는 도구 류 로 이해 할 수 있 습 니 다.
예 를 들 어 InstrumentationTestCase 를 이용 하여 activity 를 시작 합 니 다.
androidTest 아래 자바 클래스 를 새로 만 들 고 InstrumentationTestCase 에서 Public void 를 만 드 는 방법 을 계승 합 니 다.그러나 방법 명 이 test 로 시작 해 야 합 니 다.예 를 들 어 test Publish Subject 는@Test 주해 가 필요 하지 않 습 니 다.
public class TestSubject extends InstrumentationTestCase {
private static final String LOG_TAG = "test";
public void testPublishSubject() {
launchActivity("demo.zts.com.demo",SecondActivity.class,null);
}
}
2.ApplicationTestCase―전체 응용 프로그램의 종 류 를 테스트 합 니 다.응용 프로그램 에 아 날로 그 Context 를 주입 할 수 있 습 니 다.프로그램 이 시작 되 기 전에 테스트 파 라 메 터 를 초기 화하 고 프로그램 이 끝 난 후에 프로그램 을 없 애기 전에 검사 할 수 있 습 니 다.Context 를 사용 하면 자원,파일,데이터베이스 등 을 탐색 할 수 있 습 니 다.기본 클래스 는 AndroidTestCase 로 일반적으로 하위 클래스 가 특정 구성 요소 와 연 결 됩 니 다.
테스트 코드 는 다음 과 같 습 니 다:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
String app_name = getResources().getString(R.string.app_name);
Log.i("MyApp",".........MyApp....app_name.........."+app_name);
}
}
public class ApplicationTest extends ApplicationTestCase<MyApp> {
public ApplicationTest() {
super(MyApp.class);
}
public void testStart() {
String str = null;
str = mContext.getResources().getString(R.string.app_name);
Log.i("..",".............ApplicationTest ...........app_name............."+str);
}
로그 로그:07-22 23:27:10.276 32259-32259/demo.zts.com.demo I/MyApp: .........MyApp....app_name..........demo
07-22 23:27:10.276 32259-32319/demo.zts.com.demo I/TestRunner: started: testStart(demo.zts.com.demo.ApplicationTest)
07-22 23:27:10.286 32259-32319/demo.zts.com.demo I/..: .............ApplicationTest..........app_name..............demo
3.Activity UnitTestCase―단일 Activity 에 대해 단일 테스트 를 하 는 유형.그것 을 사용 하면 아 날로 그 Context 나 Application,또는 두 가 지 를 주입 할 수 있 습 니 다.이것 은 Activity 에 대해 유닛 테스트 를 하 는 데 사용 된다.즉,단독 activity 를 테스트 하 는 데 사용 할 수 있 습 니 다.아 날로 그 나 실제 컴퓨터 를 이용 하여 시작 해 야 하지만 테스트 를 해 야 할 activity 만 시작 합 니 다.다른 activity 와 는 무관 합 니 다.
테스트 코드 는 다음 과 같 습 니 다:
테스트 할 activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("...............MainActivity......onCreate............");
Log.i("MainActivity","................onCreate............................");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("...............MainActivity......onStart............");
Log.i("MainActivity","................onStart............................");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("...............MainActivity......onStop............");
Log.i("MainActivity","................onStop............................");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("...............MainActivity......onDestroy............");
Log.i("MainActivity","................onDestroy............................");
}
}
테스트 클래스
public class TestActivity extends ActivityInstrumentationTestCase2<MainActivity> {
private Context ctx;
public TestActivity() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
ctx = getActivity().getApplicationContext();
}
public void testStart() {
Intent intent = new Intent(ctx, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(intent);
Log.i("TestActivity","................startActivity............................");
}
테스트 로그 로그:* 07-22 23:39:44.146 3171-3171/demo.zts.com.demo I/System.out: ...............MainActivity......onCreate............
07-22 23:39:44.146 3171-3171/demo.zts.com.demo I/MainActivity: ................onCreate............................
07-22 23:39:44.151 3171-3171/demo.zts.com.demo D/MZPerfObserver: demo.zts.com.demo onCreate consume 153 ms
07-22 23:39:44.151 3171-3171/demo.zts.com.demo I/System.out: ...............MainActivity......onStart............
07-22 23:39:44.151 3171-3171/demo.zts.com.demo I/MainActivity: ................onStart............................
07-22 23:39:44.326 3171-3171/demo.zts.com.demo D/OpenGLRenderer: Enabling debug mode 0
07-22 23:39:44.361 3171-3171/demo.zts.com.demo I/System.out: ...............MainActivity......onStop............
07-22 23:39:44.361 3171-3171/demo.zts.com.demo I/MainActivity: ................onStop............................
07-22 23:39:44.421 3171-3224/demo.zts.com.demo I/TestActivity: ................startActivity............................
그리고 흔히 볼 수 있 는 테스트 도 많 습 니 다.예 를 들 어 ServiceTestCase,Provider TestCase 2 등 은 여러분 이 천천히 생각해 야 합 니 다.
안 드 로 이 드 가 자체 적 으로 가지 고 있 는 준 it 유닛 테스트 의 일부 테스트 클래스(test 테스트,아 날로 그 기기 가 필요 없 이 컴퓨터 가 직접 실행)
예 를 들 어 저 는 자바 코드 를 테스트 해 야 합 니 다.이 자바 코드 는 안 드 로 이 드 와 관계 가 없습니다.즉,안 드 로 이 드 의 자원,예 를 들 어 context,activity 등 을 사용 하지 않 아 도 됩 니 다.말하자면 간단 한 자바 테스트 입 니 다.물론 헤헤,안 드 로 이 드 스튜디오 도 자바 코드 테스트 를 할 수 있 습 니 다.
테스트 코드 는 다음 과 같 습 니 다.테스트 4+4 는 몇 과 같 습 니까?
public class ExampleUnitTest {
@Test
public void testAdd() {
int i = 0;
i = 4+4;
System.out.print(".............. "+i);
Log.i("TAG","..................."+i);
// i 8 , !!!
Assert.assertEquals(8, i);
}
}
테스트 성공:이상 테스트 클래스 의 실행 은-테스트 우 클릭-RunXXXX 선택
/**********************화려 한 분할 선*********************************/
한참 을 보 았 지만 글 에서 처음에 언급 한 아 픈 점 을 해결 하지 못 한 것 같 습 니 다.바로 제 가 안 드 로 이 드 의 자원 을 테스트 해 야 하 는데 무 거 운 아 날로 그 나 실제 기 계 를 실행 하고 싶 지 않 습 니 다.어떻게 해 야 합 니까?엄마,속 았 어.돈 갚아.- -,,,확실히 위 에서 언급 한 테스트 방법 은 아 날로 그 테스트 를 부탁 하 는 통 증 을 해결 하지 못 했 지만 아 날로 그 유닛 테스트 를 바탕 으로 하 는 안 드 로 이 드 테스트 는 우리 가 단독 기능 의 테스트 를 하 는 데 편리 하고 UI 테스트 를 할 수 있 습 니 다.아 날로 그 기기 나 실제 기기 가 필요 하기 때문에 UI 나 그림 테스트 는 문제 가 없습니다.그리고 test 테스트 는 안 드 로 이 드 자원 이 필요 없 는 자바 코드 테스트 를 할 수 있 고 안 드 로 이 드 개발 에 도 편리 합 니 다.eclipse 를 사용 하여 테스트 하지 않 아 도 됩 니 다.직접 안 드 로 이 드 studio 도 가능 합 니 다.
흔들흔들,이어서 흔들흔들- ///
사실은 아 날로 그 기기 나 실제 컴퓨터 에서 벗 어 나 려 면 안 드 로 이 드 자원 을 사용 하 는 테스트 를 해 야 한다.예 를 들 어 Context,탐색 자원,파일,데이터 베이스 등 이다.할 수 있어!!그럼 제3자 테스트 프레임 워 크 밖 에 없어 요.Robolectric.
666,홍보 하 러 오 셨 어 요?- -,,,하지만 정말 좋 습 니 다.우리 의 아 픈 점 도 잘 해결 할 수 있 습 니 다.
다음은 내 가 너 희 를 속 이지 않도록 필요 한 것 을 이용 하여 Robolectric 테스트 를 설명 하 겠 다.
안 드 로 이 드 디 렉 터 리 에 있 는 assets 의 json 01.txt 파일 을 가 져 오 는 것 은 json 데이터 입 니 다.나중에 분석 하고 분석 한 후에 데 이 터 를 표시 합 니 다.분석:이 수 요 는 안 드 로 이 드 의 자원 과 관련 이 있 습 니 다.우 리 는 Robolectric 을 이용 하여 유닛 테스트 를 하고 아 날로 그 기기 나 실제 기기 의 지원 이 필요 하지 않 습 니 다.
그 중 제 이 슨 데이터
{
"name": "coolxing",
"age": 24,
"male": true,
"address": {
"street": "huiLongGuan",
"city": "beijing",
"country": "china"
}
}
우선 Robolectric 의존 이 필요 합 니 다.app module 에 의존 을 주입 하 십시오.testCompile 'org.robolectric:robolectric:3.0'
안 드 로 이 드 TestCompile 이 아 닌 testCompile 을 주의 하 십시오.그렇지 않 으 면 시 뮬 레이 터 를 시작 해 야 합 니 다.그리고 테스트 클래스 도 test 에 있 습 니 다.
테스트 클래스:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest2 {
@Test
public void testJson(){
String str = null;
str = RuntimeEnvironment.application.getResources().getString(R.string.app_name);
AssetManager am = null;
am = RuntimeEnvironment.application.getAssets();
String strData = null;
try {
InputStream inputStream = am.open("json01.txt");
byte buf[] = new byte[1024];
inputStream.read(buf);
strData = new String(buf);
strData =strData.trim();
strData.trim();
} catch (IOException e) {
}
jsonBean foo = new Gson().fromJson(strData, jsonBean.class);
System.out.println("...............json.................."+foo.name);
System.out.println("...............json.................."+foo.address);
System.out.println("...............json.................."+foo.age);
}
}
테스트 결과:보 세 요.우 리 는 application 을 이용 하여 안 드 로 이 드 의 자원 을 얻 었 습 니 다.그러나 방금 위 에 있 는 안 드 로 이 드 TestCompile 처럼 아 날로 그 기기 가 필요 하지 않 습 니 다.6 이 아 닙 니까?제 컴퓨터 설정 이 비교적 낮 습 니 다.이번 테스트 는 40S 가 필요 하지만 실제 컴퓨터 가 훨씬 빠 릅 니 다.
am = RuntimeEnvironment.application.getAssets();
몇 가지 주의 가 필요 합 니까? @ 주석:@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
또한 테스트 방법 은 textxxx()로 시작 합 니 다.예 를 들 어 위의 testJSon(),방법 도@Test 주석 이 필요 합 니 다!!Robolectric 은 activity 도 테스트 할 수 있 습 니 다.예 를 들 어:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest2 {
@Test
public void testMainActivity() {
MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);
mainActivity.findViewById(R.id.main_tv).performClick();
Intent expectedIntent = new Intent(mainActivity, SecondActivity.class);
ShadowActivity openActivity = Shadows.shadowOf(mainActivity);
Intent actualIntent = openActivity .getNextStartedActivity();
// Assert.assertEquals(expectedIntent, actualIntent);
}
그 속MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);
이 코드 는 MainActivity 를 시작 하 는 라 이 프 사이클 입 니 다.Robolectric 유닛 테스트 클래스 의 시작 도 위 test 테스트 클래스 와 마찬가지 로-mainActivity Test 2-오른쪽 키-Run MainActivity Test 2 를 선택 하 십시오.
자,유닛 테스트 는 여기까지 소개 하 겠 습 니 다.
사실 저도 초보 적 으로 이 해 했 을 뿐 입 니 다.위의 기본 적 인 것 도 제 가 프로젝트 를 하 는 데 필요 해서 제 가 배 워 서 사용 하 는 것 입 니 다.그리고 많은 강력 한 기능 도 있 습 니 다.여러분 들 이 천천히 탐색 하 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.