Robolectric과 PowerMock(EasyMock)을 이용한 AlarmReceiver 테스트

안드로이드 2010/12/02 22:56

Robolectric을 이용하여 큐픽(안드로이드 앱)에 테스트를 붙여 보고 있습니다.

사실 테스트를 시작한 이유가 GPS 문제를 해결해 보고자 하는 것이어서 열린약국찾기에 테스트를 붙여 보려 했으나,

내부 구조가 (제 실력으로) 테스트를 붙이기에 수월하게 되어 있지 않아 우선은 큐픽으로 연습을 해 보는 것입니다.

 

큐픽에서는 일정 시간마다 서버에 최신 사진이나 글이 올라와 있는지 체크를 하는 기능이 있습니다.

여기에 테스트를 붙여 보았습니다.

 
@RunWith(RobolectricTestRunner.class)
public class AlarmReceiverTest {
	
    Context mockContext;
    SharedPreferences mockPrefs;
    NotificationManager mockNotificationManager;
    NetworkHelper mockNetworkHelper;
    AlarmReceiver receiver;
    
    @Before
    public void SetUp() {
        receiver = new AlarmReceiver();
        
        mockPrefs = PowerMock.createMock(SharedPreferences.class);
        mockNotificationManager = PowerMock.createMock(NotificationManager.class);
        mockNetworkHelper = PowerMock.createMock(NetworkHelper.class);
        NetworkHelper.setInstance(mockNetworkHelper);

        Date now = new Date();
        long fiveMinAgo = now.getTime() - 5 * 60 * 1000;
        expect(mockPrefs.getBoolean("auto_update_vibrate", true)).andReturn(true);
        // 가장 최근에 확인한 시간을 5분 전으로 세팅
        expect(mockPrefs.getLong("lastCheckedDate", 0)).andReturn(fiveMinAgo);
        replay(mockPrefs);

        // 가짜 pref와 notificationManager를 반환하는 context 생성
        mockContext = PowerMock.createMock(Context.class);
        expect(mockContext.getSharedPreferences("pref", Context.MODE_PRIVATE)).andReturn(mockPrefs);
        expect(mockContext.getSystemService(Context.NOTIFICATION_SERVICE)).andReturn(mockNotificationManager);
        replay(mockContext);
    }
    
    @After
    public void TearDown() {
        // NetworkHelper를 정리.
        NetworkHelper.setInstance(null);
    }
    
    // 마지막으로 체크한지 5분이 지났는데 사진이 1개 올라온 경우 알림이 울리는지 체크 
	@Test
	public void TestOnReceive_1photo_during5min() {		
		// 얻어오는 사진이 1장 있음
	    expect(mockNetworkHelper.GetCountOfNewPhotos(EasyMock.anyObject(Date.class))).andReturn(new NewContentInfo(1, 0));
	    replay(mockNetworkHelper);
	    // NotificationManager에 notify가 한번 불려야 한다.
        mockNotificationManager.notify(EasyMock.anyInt(), EasyMock.anyObject(Notification.class));
        replay(mockNotificationManager);
        
		receiver.onReceive(mockContext, null);

		EasyMock.verify(mockNotificationManager);
	}
	
	// 5분 동안 사진이 안올라 온 경우 알람이 울리는지 체크
	@Test
    public void TestOnReceive_0photo_during5min() {     
        // 얻어오는 사진이 0장 있음
        expect(mockNetworkHelper.GetCountOfNewPhotos(EasyMock.anyObject(Date.class))).andReturn(new NewContentInfo(0, 0));
        replay(mockNetworkHelper);
        
        // NotificationManager에 notify가 불리면 안된다.
        replay(mockNotificationManager);
        receiver.onReceive(mockContext, null);

        EasyMock.verify(mockNotificationManager);
    }
	
	// 5분 동안 댓글만 하나 올라 온 경우 알람이 울리는지 체크
    @Test
    public void TestOnReceive_1comment_during5min() {     
        // 얻어오는 사진이 0장 있음
        expect(mockNetworkHelper.GetCountOfNewPhotos(EasyMock.anyObject(Date.class))).andReturn(new NewContentInfo(0, 1));
        replay(mockNetworkHelper);
        
        // NotificationManager에 notify가 한번 불려야 한다.
        mockNotificationManager.notify(EasyMock.anyInt(), EasyMock.anyObject(Notification.class));
        replay(mockNotificationManager);
        receiver.onReceive(mockContext, null);

        EasyMock.verify(mockNotificationManager);
    }
	
}

아주 단순한 것이지만, 이렇게 테스트를 해볼 수 있다는 것이 신기하네요.

점점 더 많은 테스트를 붙여서 커버리지를 넓혀봐야겠습니다.



Trackback 0 : Comment 1

Trackback Address :: http://chumbal.tistory.com/trackback/42 관련글 쓰기

  1. 하얀별 2012/01/11 21:38 Modify/Delete Reply

    글 잘 읽어보았습니다. ^^
    Robolectric을 쓰시면서 단점 같은건 없었나요?
    예를들어 JNI가 불가능하다던지 실제 에뮬을 돌릴때와 좀 다른 점 같은거요~
    알려주시면 감사하겠습니다!

Write a comment





안드로이드에서의 유닛 테스트 : Robolectric을 소개합니다.

안드로이드 2010/11/30 00:27

몇 개 안되는 앱을 개발해서 배포 하면서 제일 문제가 많았던 것은 GPS 였습니다.

거의 대부분의 시간을 회사 안에서 보내는 입장이다보니 밖에서 사용을 해봐야 하는 GPS는 아무래도 테스트가 부족했던 것이지요.

또한 취미 생활로 개발을 하는 입장에서 테스트에 많은 시간을 할애하기도 힘들고 여러모로 무언가 해결책이 필요하다고 느끼고 있었습니다.

 

그래서 주목하고 있던 것이 유닛 테스트 였습니다.

사실 안드로이드에서 기본적으로 제공되는 방법으로 helloworld 느낌의 테스트를 만드는 것은 정말 손쉬웠습니다.

많은 분들이 어떻게 하는 것인지 잘 설명해 주고 계셔서 첫 걸음은 정말 빨리 뗄 수 있었습니다.

그런데 이 환경은 여러 가지 문제가 많았습니다.

우선 Mock Framework를 쓰는 것이 제한되었고, 에뮬레이터나 실기에서 작동하기에 한 번 테스트를 시작하려면 최소 7초 정도가 소요되었습니다.

구글링을 계속 하다보니 비슷한 고민을 하는 사람들이 많이 있었고, 결국엔 Robolectric 이라는 신생 라이브러리를 발견하게 되었습니다.

 

홈페이지 : http://pivotal.github.com/robolectric/index.html

구글 그룹 : http://groups.google.com/group/robolectric?lnk=iggc

 

귀여운 아이콘의 Robolectric은 현재 0.9.2 버전이 최신이며, 위의 모든 단점을 커버할 수 있는 방향으로 개발이 진행되고 있습니다.

 

아래 소개 동영상을 한번 보시면 어떤 것인지 감을 잡으실 수 있습니다.

 

저도 아직 제대로 사용을 하고 있지 못하기 때문에 자세한 소개는 해 드릴  수는 없지만, 이 라이브러리에 기대를 하고 있습니다.

공부를 좀 더 해보고 좀 더 자세한 이야기를 해드릴 수 있게 되었으면 좋겠습니다. ^^;

 

이제 금방 시작한 라이브러리인지라 개발자들의 피드백도 빠르고 친절하게 답변해주니 사용상의 어려움이 있으면 구글 그룹을 이용해 보세요.

한국 사용자 분들이 늘어서 정보를 공유할 수 있게 되기를 희망합니다.



Trackback 0 : Comment 1

Trackback Address :: http://chumbal.tistory.com/trackback/41 관련글 쓰기

  1. 최지순 2010/12/23 18:40 Modify/Delete Reply

    이제야 이 포스팅을 발견 하네요 좋은 정보 감사 합니다.

Write a comment





Cupic [큐픽] - 트위터 기반 사진 커뮤니티 앱

안드로이드 2010/10/12 23:35


이름       : Cupic [큐픽]

분류       : 엔터테인먼트

가격       : 무료

언어       : 한국어

제작자    : 조경식

지원버전 : 1.6

스토어    : 안드로이드 마켓


안녕하세요.


open api 공부를 하다가 트위터 기반의 사진 공유 앱을 하나 만들어 보았습니다.
이름은 cute + pic 해서 cupic [큐픽] 이라고 붙였습니다. ^^

트위터 계정으로 접속하여 핸드폰에서 사진을 찍고 yfrog에 올릴 수 있으며, 다른 사람이 올린 사진에 댓글을 달 수 있습니다.
재미있는 사진이 있으면 많은 사람들과 함께 공유해 보세요.

사진을 올린 사람의 트위터 소개를 볼 수 있고, 맘에 드는 사람을 팔로우 할 수 있습니다.

사용해봐 주시고 많은 피드백 부탁드립니다. ^^;

마켓에서 cupic이나 큐픽으로 검색하시거나, qrcode를 이용하시면 됩니다.

스크린샷
 cupic_006.png small_cupic_006.png 

QR CODE
qrcode.png 
Trackback 0 : Comment 0

Trackback Address :: http://chumbal.tistory.com/trackback/39 관련글 쓰기

Write a comment

◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [12] : NEXT ▶