web-dev-qa-db-ja.com

Android SQLiteOpenHelperのJUnitテスト

私はjunitテストが初めてです。

誰でも私を助けることができますか、私のSQLiteOpenHelperクラスをテストする方法。

実装する必要のあるクラスと、データベースとテーブルをテストする方法を意味します。私はEclipse IDEを使用しています。

36

APIレベル24以降、RenamingDelegatingContextは非推奨になりました。 Another スレッドは使用を提案します RobolectricRuntimeEnvironment.applicationこの中の記事 で説明されています。

参考のための古い答え:

単純な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
    }
}

私は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 which is not connected to the standard database of the App
    }
}
66
Pietro

write Android JUnit4スタイルのデータベーステスト もできます。データベースに次の依存関係を追加するだけです

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

次のようにTestクラスをマークします

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

RenamingDelegatingContextはv24で廃止されました。 Robolectricを使用してテストします。以下の例(Kotlin)

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

https://github.com/elye/demo_simpledb_test からプロジェクト全体のソースを取得できます

https://medium.com/@elye.project/Android-sqlite-database-unit-testing-is-easy-a09994701162#.s44tity8x から詳細を得ることができます

2
Elye

この質問は非常に抽象的なものです。 Androidテストガイドをお読みください。テストの簡単な例がいくつかありますAndroidアプリ。

Android Testing Support Library

Androidテストトレーニング

コードがわからないので、SQLiteOpenHelperがアクティビティまたはサービスによって使用されていると思います。このアクティビティ/サービスは、テストする必要があると思います。

良いスタートは、アクティビティの場合は ActivityInstrumentationTestCase2 、サービスの場合はServiceTestCaseです。

お役に立てば幸いです。

0
sabadow