Android-Gradle-Robolectric 에서 Sqlite DB 테스트 하기

개발 이야기 2014. 6. 30. 23:51

Robolectric 을 테스트 프레임웍으로 선택한 이유는 단 하나이다.

에뮬레이터 없이 View와 로직 테스트가 되기 때문이다

그래서 오늘은 Sqlite 에서 DB 테스트하는 것으로 공부해봤습니다.


아참! 참고로 이 로그들은 모두 제가 쓰면서 기록하는 것이 아니라
공부 하면서 남기는 로그이기 때문에 항상 맞다고 보장할 순 없습니다.
다만 테스트를 돌렸을 때 예상된 값이 정상 출력 되기 때문에 되는구나! 하는 것입니다.


1. 존재하는 Sqlite DB 파일 테스트하기.

 

우선 위와 같이 테스트용 DB 파일을 준비하였습니다.

구조는 아래와 같습니다.

컬럼명 

자료형 

id 

INTEGER , NN/PK/AI 

name 

TEXT 

ages

INTEGER 


그리고 아래와 같이 테스트 코드를 작성합니다.

@Config(manifest = "src/main/AndroidManifest.xml", emulateSdk = 18)
@RunWith(RobolectricGradleTestRunner.class)
public class DatabaseConverterTest {
   @Test
    public void testConvertCursor() {

        SQLiteDatabase sqLiteDatabase = SQLiteDatabase.openDatabase("src/androidTest/resources/databases/test.db", null, 0);
        Cursor user = sqLiteDatabase.query("user", null, null, null, null, null, null);
        List mockTOs = DatabaseConverter.convertCursorToObject(user, MockTO.class);

        assertTrue(mockTOs.size() > 0);

    }

    @DatabaseBeans
    static class MockTO {

        @Id
        @Column
        private int id;

        @Column
        private String name;
        @Column(column = "ages")
        private int age;
    }
}


그리고는 그냥 테스트를 돌립니다...-_-;
참 쉽죠잉?


2. Sqlite DB 파일이 없는 경우

1번이야 DB 파일을 기기에서 추출하면 된다지만 사실 이게 매번 번거롭기 그지 없습니다.
언제나 그랬듯이 귀차니즘은 최고의 효율을 만든다 하였으니...
우리 테스트하고자하는 원본 소스 내부에 있는 SqliteOpenHelper 클래스를 이용하여 테스트용 데이터를 완성 후 자동으로 돌리면 어떤가 하고 생각해봤습니다.

그러기 위해서는 가장 필요한 SqliteOpenHelper 로도 자유롭게 DB 생성-쿼리 동작까지 정상적으로 되는지를 확인해야죠.

그래서 이번에는 아래와 같이 테스트해봤습니다.

@Config(manifest = "src/main/AndroidManifest.xml", emulateSdk = 18)
@RunWith(RobolectricGradleTestRunner.class)
public class DatabaseConverterTest {
    @Test
    public void testConvertCursotNoDBFile() {
        MockOpenHelper openHelper = new MockOpenHelper(Robolectric.application);
        SQLiteDatabase writableDatabase = openHelper.getWritableDatabase();


        ContentValues values = new ContentValues();
        values.put("name", "aaa");
        values.put("ages", 155);
        long userSeq = writableDatabase.insert("user", null, values);

        SQLiteDatabase readableDatabase = openHelper.getReadableDatabase();

        Cursor user = readableDatabase.query("user", null, null, null, null, null, null);
        List mockTOs = DatabaseConverter.convertCursorToObject(user, MockTO.class);

        assertTrue(mockTOs.size() > 0);
        MockTO mockTO = mockTOs.get(0);
        assertEquals(155, mockTO.age);
        assertEquals("aaa", mockTO.name);
        assertEquals(userSeq, mockTO.id);

    }

    static class MockOpenHelper extends SQLiteOpenHelper {

        public MockOpenHelper(Context context) {
            super(context, "mockdb", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table if not exists user  ( id integer not null primary key autoincrement, name text, ages integer);");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }
    }
}

그리고는 테스트를 돌려봤습니다...잘 되더군요 -ㅁ-


위 사항은 Robolectric 2.3 부터 제공되는 것이고
2.2 까지는 ShadowSqliteOpenHelper 를 이용하여 구현했어야 하는데
RobolectricTestRunner 가 자동으로 설정해주는 것 같습니다 :)


어쨋든 현재까지는 일반 연산 로직과 Sqlite DB 테스트가 가능하네요.
사실 이정도만 되도 테스트 커버리지를 60% 가량 채우는데는 문제 없습니다.


하지만..
인간의 욕심은 끝이 없지요..
조만간 View 공부해야겠네요


위 내용들은 현재 제 보잘것 없는 Github 에서 확인하실 수 있습니다. :)

Github : https://github.com/ZeroBrain/Android-Sqlite-Object-Convert

설정

트랙백

댓글