web-dev-qa-db-fra.com

Tests unitaires de base de données Android SQLite

Je suis nouveau dans le développement d'applications Android et je viens de faire une application de note. Je souhaite effectuer des tests unitaires pour les méthodes insertNote, readNote et updateNote pour la base de données. Comment puis-je m'y prendre? C'est le code de ma base de données. Merci.

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

Un moyen d'implémenter le test SQLite consiste à utiliser un instrumented instrument test , à l'aide de InstrumentationRegistry dans le package de test Android pour obtenir un contexte.

Voici un exemple tiré d'un tutorial et d'un exemple sur 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

Essayez de trouver des tutoriels et des articles sur le test unitaire de la base de données SQLite en Java. Les tests unitaires sous Java et Android sont certainement les mêmes.

Bien que vous trouviez ces sujets sur Stack:

Comment tester sqlite Android avec Junit?

Comment tester les méthodes qui traitent de base de données SQLite dans Android?

ou cet article: 

Android Easy SQLite avec des tests unitaires

Selon les tests de base de données SQLite avec Junit, vérifiez les points suivants:

Test Android JUnit pour SQLiteOpenHelper

où trouveriez-vous cette solution:

Pour un simple 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
      }
    }

J'ai créé un 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
      }
  }

Lire aussi: 

Utilisation de Junit pour tester l'écriture et la lecture sur SQLite

Test de la sous-classe SQLiteOpenHelper avec JUnit

8
piotrek1543

Cette réponse suggère la librairie Roboélectrique . Cela a fonctionné pour moi. C'est plus rapide qu'un test instrumenté, qui doit s'exécuter dans un émulateur.

0
dfrankow