Android JUnit测试SQLiteOpenHelper

37

我刚开始学习JUnit测试。

请问有人可以帮我,教我如何测试我的SQLiteOpenHelper类。

也就是说,我需要实现哪些类以及如何测试我的数据库和表格。 我正在使用Eclipse IDE。


使用 InstrumentationRegistry - Cabezas
4个回答

65

从API 24开始,RenamingDelegatingContext已经被弃用。 另一个线程建议使用RobolectricRuntimeEnvironment.application,如这篇Medium文章所述。

供参考的旧答案:

对于一个简单的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
    }
}

8
对于使用RenamingDelegatingContext()的做法,我给予+1的支持,它在测试中非常有用。 - eternay
3
我认为android-test-environment不需要Test注释,请参见:http://developer.android.com/tools/testing/testing_android.html super.setUp()方法为空,但从技术上讲,你可能应该包括它。 要访问数据库,你可能需要做类似这样的事情:db.getWritableDatabase(); - Pietro
2
在使用gradle:1.1.0、mockito-core:1.9.5和junit:4.12的Android Studio中,@Test注释实际上被标记为错误,因此似乎不再必要甚至不允许使用。取而代之的是(据我所知)用前缀“test”来命名测试用例。 - AgentKnopf
1
@Zainodis 我已根据您的输入更新了代码。 - Pietro
1
@Zainodis 目前我没有在开发 Android,但是在 tearDown 方法中使用 db.delete("mytable", null, null); 怎么样?在 https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#delete(java.lang.String,%20java.lang.String,%20java.lang.String[]) 中提到,传递 null 将删除表中的所有行。 - Pietro
显示剩余5条评论

4

您也可以使用JUnit4风格编写Android数据库测试。您只需要在数据库中添加以下依赖项即可:

http://www.singhajit.com/testing-android-database/
androidTestCompile('com.android.support.test:runner:0.3'){
        exclude group: 'com.android.support', module: 'support-annotations'
    }

并将您的测试类标记如下:

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

2

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了解更多信息。该链接提供详细说明。

0

这个问题非常抽象。

我建议您阅读《Android测试指南》。它有一些简单的测试Android应用程序的示例。

Android测试支持库

Android测试培训

不知道您的代码,我猜测您的SQLiteOpenHelper是由一个Activity或Service使用的。我认为这些Activities/Services是您必须测试的。

对于Activity,一个很好的起点应该是ActivityInstrumentationTestCase2,对于Service则是ServiceTestCase。

希望能帮到您。


3
谢谢,伙计。我已经阅读了那份Android指南。但是对于JUnit仍然有些困惑。 - Kartihkraj Duraisamy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接