wake-up-neo.net

Testen der SQLite-Datenbankeinheit für Android

Ich bin neu in der Android-App-Entwicklung und habe gerade eine Notiz-App erstellt. Ich möchte Komponententests für die Methoden insertNote, readNote und updateNote für die Datenbank durchführen. Wie gehe ich vor? Dies ist der Code für meine Datenbank. Vielen Dank.

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();
}

}

12
Anderson

Eine Möglichkeit zum Implementieren von SQLite-Tests besteht in einem instrumentierten Unit-Test . Verwenden Sie InstrumentationRegistry im Android-Testpaket, um einen Kontext zu erhalten.

Hier ist ein Beispiel aus einem Tutorial und ein Beispiel zu GitHub :

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));
    }
}
17
Cabezas

Versuchen Sie, einige Tutorials und Artikel über die SQLite-Datenbank für Komponententests in Java zu finden. Das Testen von Einheiten in Java und Android ist sicherlich dasselbe.

Obwohl Sie diese Themen auf Stack finden würden:

Wie teste ich Android sqlite mit junit?

Wie teste ich Methoden, die mit der SQLite-Datenbank in Android umgehen?

oder dieser Artikel: 

Android Easy SQLite mit Komponententests

Überprüfen Sie Folgendes beim Testen der SQLite-Datenbank mit Junit:

Android JUnit-Test für SQLiteOpenHelper

wo würden Sie diese Lösung finden:

Für einen einfachen DatabaseHandler:

<!-- 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
      }
    }

Ich habe ein AndroidTestCase erstellt:

<!-- 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
      }
  }

Lesen Sie auch: 

Junit zum Testen von Schreiben und Lesen in SQLite verwenden

SQLiteOpenHelper-Unterklasse mit JUnit testen

8
piotrek1543

Diese Antwort schlägt die Roboelectric-Bibliothek vor . Das hat bei mir funktioniert. Es ist schneller als ein instrumentierter Test, der in einem Emulator ausgeführt werden muss.

0
dfrankow