2015-12-14 22 views
9

Tôi mới phát triển ứng dụng Android và tôi vừa tạo một ứng dụng ghi chú. Tôi muốn làm các bài kiểm tra đơn vị cho các phương thức insertNote, readNote và updateNote cho cơ sở dữ liệu. Làm thế nào để tôi đi về điều này? Đây là mã cho cơ sở dữ liệu của tôi. Cảm ơn.Thử nghiệm đơn vị cơ sở dữ liệu SQLite Android

public class DatabaseManager extends SQLiteOpenHelper { 


public static final String Database_Name = "Notes Database"; 
public static final String Table_Name = "notes"; 

public static final String Column_id = "textId"; 
public static final String Column_title = "textTitle"; 
public static final String Column_body = "textBody"; 

public DatabaseManager(Context context){ 
    super(context, Database_Name, null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db){ 
    db.execSQL("CREATE TABLE " + Table_Name + " (" + Column_id + 
      " INTEGER PRIMARY KEY AUTOINCREMENT, " + Column_title + 
      " TEXT, " + Column_body + " TEXT)"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
    db.execSQL("DROP TABLE IF EXISTS" + Table_Name); 
    onCreate(db); 
} 

public void insertNote(Note note){ 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(Column_title, note.getTextTitle()); 
    values.put(Column_body, note.getTextBody()); 

    boolean result = db.insert(Table_Name, null, values) > 0; 
    if (result == true) 
     Log.d("Create", "Data Has Been Saved"); 
    db.close(); 
} 

public Cursor readNote(int id){ 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.rawQuery("SELECT * FROM " + Table_Name + " WHERE _ROWID_ = " + id, null); 

    if (cursor != null){ 
     cursor.moveToFirst(); 
    } 

    Note myNote = new Note(); 
    myNote.textId = cursor.getInt(cursor.getColumnIndex(Column_id)); 
    myNote.textTitle = cursor.getString(cursor.getColumnIndex(Column_title)); 

    return cursor; 
} 

public ArrayList<String> getNoteList(){ 
    ArrayList<String> noteList = new ArrayList<>(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT * FROM " + Table_Name, null); 
    cursor.moveToFirst(); 

    if (cursor.moveToFirst()){ 
     do{ 
      //noteList.add(cursor.getInt(cursor.getColumnIndex(Column_id))); 
      noteList.add(cursor.getString(cursor.getColumnIndex(Column_title))); 
     } 
     while (cursor.moveToNext()); 
    } 

    return noteList; 
} 

public int updateNote(Note note){ 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put("textTitle", note.getTextTitle()); 
    values.put("textBody", note.getTextBody()); 

    int update = db.update(Table_Name, values, Column_id + " = ?", new String[]{Integer.toString(note.getTextId())}); 
    return update; 
} 

public Integer deleteNote(int id){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(Table_Name, Column_id + " = ?", new String[]{Integer.toString(id)}); 
} 

public int getCount(){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT * FROM " + Table_Name, null); 
    cursor.close(); 

    return cursor.getCount(); 
} 

}

Trả lời

5

Cố gắng tìm thấy một số hướng dẫn, bài viết về cơ sở dữ liệu SQLite kiểm tra đơn vị trong Java. Kiểm thử đơn vị trong Java và Android chắc chắn giống nhau.

Mặc dù bạn sẽ tìm thấy các chủ đề này trên Stack:

How to test Android sqlite with junit?

How to test methods that deal with SQLite database in android?

hoặc bài viết này:

Android Easy SQLite With Unit Tests

Theo thử nghiệm SQLite databese với Junit, kiểm tra này :

Android JUnit test for SQLiteOpenHelper

nơi bạn sẽ tìm thấy giải pháp này:

Đối với một DatabaseHandler đơn giản:

<!-- language: java --> 

    public class MyDatabase extends SQLiteOpenHelper { 
     private static final String DATABASE_NAME = "database.db"; 
     private static final int DATABASE_VERSION = 1; 

     public MyDatabase(Context context){ 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db){ 
      // some code 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // some code 
     } 
    } 

Tôi tạo ra một AndroidTestCase:

<!-- language: java --> 

    public class DatabaseTest extends AndroidTestCase { 
     private MyDatabase db; 

     @Override 
     public void setUp() throws Exception { 
      super.setUp(); 
      RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_"); 
      db = new MyDatabase(context); 
     } 

     @Override 
     public void tearDown() throws Exception { 
      db.close(); 
      super.tearDown(); 
     } 

     //According to Zainodis annotation only for legacy and not valid with gradle>1.1: 
     //@Test 
     public void testAddEntry(){ 
      // Here i have my new database wich is not connected to the standard database of the App 
     } 
    } 

đọc thêm:

Using Junit to test writing and reading to SQLite

Testing SQLiteOpenHelper subclass with JUnit

14

Hầu hết các bí mật thực hiện thử nghiệm SQLite với đơn vị xét nghiệm JUnit, là trong việc sử dụng các phương pháp khẳng định trong org.junit.Assert lớp. Trong bài viết này, tôi sẽ xem xét kỹ hơn các phương thức khẳng định có sẵn trong lớp này.

Cách dễ nhất là sử dụng InstrumentationRegistry trong gói thử nghiệm Android.

Một ví dụ:

import android.support.test.InstrumentationRegistry; 
import android.support.test.runner.AndroidJUnit4; 
import android.test.suitebuilder.annotation.LargeTest; 

import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 

import java.util.List; 

import static junit.framework.Assert.assertNotNull; 
import static junit.framework.Assert.assertTrue; 
import static org.hamcrest.CoreMatchers.is; 
import static org.hamcrest.MatcherAssert.assertThat; 

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class SQLiteTest { 

    private RateDataSource mDataSource; 

    @Before 
    public void setUp(){ 
     mDataSource = new RateDataSource(InstrumentationRegistry.getTargetContext()); 
     mDataSource.open(); 
    } 

    @After 
    public void finish() { 
     mDataSource.close(); 
    } 

    @Test 
    public void testPreConditions() { 
     assertNotNull(mDataSource); 
    } 

    @Test 
    public void testShouldAddExpenseType() throws Exception { 
     mDataSource.createRate("AUD", 1.2); 
     List<Rate> rate = mDataSource.getAllRates(); 

     assertThat(rate.size(), is(1)); 
     assertTrue(rate.get(0).toString().equals("AUD")); 
     assertTrue(rate.get(0).getValue().equals(1.2)); 
    } 

    @Test 
    public void testDeleteAll() { 
     mDataSource.deleteAll(); 
     List<Rate> rate = mDataSource.getAllRates(); 

     assertThat(rate.size(), is(0)); 
    } 

    @Test 
    public void testDeleteOnlyOne() { 
     mDataSource.createRate("AUD", 1.2); 
     List<Rate> rate = mDataSource.getAllRates(); 

     assertThat(rate.size(), is(1)); 

     mDataSource.deleteRate(rate.get(0)); 
     rate = mDataSource.getAllRates(); 

     assertThat(rate.size(), is(0)); 
    } 

    @Test 
    public void testAddAndDelete() { 
     mDataSource.deleteAll(); 
     mDataSource.createRate("AUD", 1.2); 
     mDataSource.createRate("JPY", 1.993); 
     mDataSource.createRate("BGN", 1.66); 

     List<Rate> rate = mDataSource.getAllRates(); 
     assertThat(rate.size(), is(3)); 

     mDataSource.deleteRate(rate.get(0)); 
     mDataSource.deleteRate(rate.get(1)); 

     rate = mDataSource.getAllRates(); 
     assertThat(rate.size(), is(1)); 
    } 
} 
Các vấn đề liên quan