web-dev-qa-db-fra.com

Test Android JUnit pour SQLiteOpenHelper

Je suis nouveau au Junit Testing.

Quelqu'un peut-il m'aider, comment tester ma classe SQLiteOpenHelper.

Cela signifie quelles classes je dois implémenter et comment tester ma base de données et mes tables ..___. J'utilise Eclipse IDE.

36

À partir du niveau 24 de l'API, RenamingDelegatingContext est obsolète. Un autre thread suggère d 'utiliser Robolectric ' s RuntimeEnvironment.application comme décrit dans cet article Medium .

Ancienne réponse pour référence:

Pour un simple DatabaseHandler:

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:

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
    }
}
66
Pietro

Vous pouvez écrire un test de base de données Android dans le style JUnit4 aussi. Vous avez juste besoin d'ajouter la dépendance suivante dans votre base de données

androidTestCompile('com.Android.support.test:runner:0.3'){
        exclude group: 'com.Android.support', module: 'support-annotations'
    }

Et marquez la classe de test comme suit

@RunWith(AndroidJUnit4.class)
public class DatabaseTest {
   @Test
   public void myFirstTest(){
      //your test
   }
}
4
Ajit Singh

RenamingDelegatingContext est maintenant obsolète en v24. Utilisez Robolectric pour tester. Un exemple (en Kotlin) comme ci-dessous

@RunWith(RobolectricGradleTestRunner::class)
@Config(constants = BuildConfig::class, sdk = intArrayOf(Lollipop), packageName = "com.elyeproj.simpledb")
class ExampleUnitTest {

    lateinit var dbHelper: DbHelper // This is your SQLOpenHelper class

    @Before
    fun setup() {
        dbHelper = DbHelper(RuntimeEnvironment.application) // Your new context from Robolectric
        dbHelper.clearDbAndRecreate() // A function just to clear and recreate DB
    }

    @Test
    @Throws(Exception::class)
    fun testDbInsertion() {

        // Given
        val testStr1 = "testing"
        val testStr2 = "testing"

        // When
        dbHelper.insertText(testStr1)
        dbHelper.insertText(testStr2)

        // Then
        assertEquals(dbHelper.getAllText(), "$testStr1-$testStr2-")
    }

    @After
    fun tearDown() {
        dbHelper.clearDb() // A function just to clear the DB
    }
}

Vous pouvez obtenir l'intégralité de la source du projet à partir de https://github.com/elye/demo_simpledb_test

Vous pouvez obtenir des précisions à partir de https://medium.com/@elye.project/Android-sqlite-database-unit-testing-is-easy-a09994701162#.s44tity8x

2
Elye

cette question est très abstraite .. Je vous recommande de lire le Guide de test Android. Il contient quelques exemples simples de tests d'applications Android.

Bibliothèque de prise en charge des tests Android

Formation aux tests Android

Sans connaître votre code, je suppose que votre SQLiteOpenHelper est utilisé par une activité ou un service. Je pense que cette Activités/Services est que vous devez tester.

Un bon début devrait être ActivityInstrumentationTestCase2 pour une activité ou ServiceTestCase pour un service.

J'espère que ça aide.

0
sabadow