Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在KMM上为SQLDelight编写单元测试_Unit Testing_Kotlin Multiplatform_Sqldelight_Kotlin Multiplatform Mobile - Fatal编程技术网

Unit testing 如何在KMM上为SQLDelight编写单元测试

Unit testing 如何在KMM上为SQLDelight编写单元测试,unit-testing,kotlin-multiplatform,sqldelight,kotlin-multiplatform-mobile,Unit Testing,Kotlin Multiplatform,Sqldelight,Kotlin Multiplatform Mobile,我想知道如何在KMM上为SQLDelight编写单元测试。首先,我甚至不能正确添加SQLDelight依赖项 val commonTest by getting { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common"))

我想知道如何在KMM上为SQLDelight编写单元测试。首先,我甚至不能正确添加SQLDelight依赖项

    val commonTest by getting {
        dependencies {
            implementation(kotlin("test-common"))
            implementation(kotlin("test-annotations-common"))
            // SQLDelight tests
            implementation("com.squareup.sqldelight:sqlite-driver:1.4.3")
        }
    }
在我添加依赖项并同步项目后,项目甚至没有生成。有人能告诉我这是否是添加sqlite驱动程序依赖项的正确方法吗


任何帮助都将不胜感激

您可以在中看到一个基本示例

如果在非测试代码中配置了sqldelight,则在
commonTest
中不需要驱动程序依赖于它自己

在我们的测试代码中,我们有一个
expect
,它为测试创建db连接

内部测试数据库连接():SqlDriver
然后在和代码中,输入
实际定义

依赖项配置(大致)如下所示:

commonMain{
实现(“com.squareup.sqldelight:runtime:1.4.4”)
}
安卓美因{
实现(“com.squareup.sqldelight:android驱动程序:1.4.4”)
}
伊斯曼{
实现(“com.squareup.sqldelight:本机驱动程序:1.4.4”)
}

这样,您就可以编写sqldelight测试了。

您可以在中看到一个基本示例

如果在非测试代码中配置了sqldelight,则在
commonTest
中不需要驱动程序依赖于它自己

在我们的测试代码中,我们有一个
expect
,它为测试创建db连接

内部测试数据库连接():SqlDriver
然后在和代码中,输入
实际定义

依赖项配置(大致)如下所示:

commonMain{
实现(“com.squareup.sqldelight:runtime:1.4.4”)
}
安卓美因{
实现(“com.squareup.sqldelight:android驱动程序:1.4.4”)
}
伊斯曼{
实现(“com.squareup.sqldelight:本机驱动程序:1.4.4”)
}
这样,您就可以编写sqldelight测试了


谢谢你的回答!我遇到了另一个问题。“预期函数‘createDriver’在JVM的模块KMM.shared(test)中没有实际声明”。在KaMPKit项目中,我没有发现任何与JVM相关的东西

包含必要的说明

您需要添加一个依赖项

dependencies {
  implementation "com.squareup.sqldelight:sqlite-driver:1.5.0"
}
dependencies {
    implementation("org.robolectric:robolectric:4.4")
}
在“jvmMain”源集中,接下来在“jvmMain”模块中实现实际的fun createDriver


我很欣赏Kevin的回答,并补充说使用SqlDeLite的测试应该放在平台模块(“androidTest”和“iosTest”)中,而不是放在“commonTest”中

您需要向SUT提供实际驱动程序的实现,使用应用程序上下文。 对于单元测试,您需要上下文的替代,例如look-to

添加依赖项

dependencies {
  implementation "com.squareup.sqldelight:sqlite-driver:1.5.0"
}
dependencies {
    implementation("org.robolectric:robolectric:4.4")
}
在“androidTest”源集中(我不知道iOS可以使用什么),获取应用程序上下文:

val context = ApplicationProvider.getApplicationContext<Context>()

谢谢你的回答!我遇到了另一个问题。“预期函数‘createDriver’在JVM的模块KMM.shared(test)中没有实际声明”。在KaMPKit项目中,我没有发现任何与JVM相关的东西

包含必要的说明

您需要添加一个依赖项

dependencies {
  implementation "com.squareup.sqldelight:sqlite-driver:1.5.0"
}
dependencies {
    implementation("org.robolectric:robolectric:4.4")
}
在“jvmMain”源集中,接下来在“jvmMain”模块中实现实际的fun createDriver


我很欣赏Kevin的回答,并补充说使用SqlDeLite的测试应该放在平台模块(“androidTest”和“iosTest”)中,而不是放在“commonTest”中

您需要向SUT提供实际驱动程序的实现,使用应用程序上下文。 对于单元测试,您需要上下文的替代,例如look-to

添加依赖项

dependencies {
  implementation "com.squareup.sqldelight:sqlite-driver:1.5.0"
}
dependencies {
    implementation("org.robolectric:robolectric:4.4")
}
在“androidTest”源集中(我不知道iOS可以使用什么),获取应用程序上下文:

val context = ApplicationProvider.getApplicationContext<Context>()

我在测试中使用上下文时遇到了问题,发现使用内存中的数据库更快。这还具有不需要设备进行测试的优点

我的做法是:

  • 将JdbcSqliteDriver添加到androidTest源集中(“共享”下的build.gradle)
  • 添加expect/actual函数以创建驱动程序:
    • 在“commonTest”目录下的文件中(例如createTestSqlDriver.kt)
    createTestSqlDriver():SqlDriver

    • 在“androidTest”下的文件中
  • 现在,我可以在“commonTest”下的测试中创建和使用数据库。比如:
  • 我发现以下帖子很有用:


    我在使用上下文进行测试时遇到了问题,发现使用内存中的数据库更快。这还具有不需要设备进行测试的优点

    我的做法是:

  • 将JdbcSqliteDriver添加到androidTest源集中(“共享”下的build.gradle)
  • 添加expect/actual函数以创建驱动程序:
    • 在“commonTest”目录下的文件中(例如createTestSqlDriver.kt)
    createTestSqlDriver():SqlDriver

    • 在“androidTest”下的文件中
  • 现在,我可以在“commonTest”下的测试中创建和使用数据库。比如:
  • 我发现以下帖子很有用:

    示例

    package com.viki.vikilitics_kmm
    
    import com.squareup.sqldelight.sqlite.driver.JdbcDriver
    import com.google.common.truth.Truth.assertThat
    import com.squareup.sqldelight.db.SqlDriver
    import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver
    import com.viki.vikiliticskmm.Event
    import com.viki.vikiliticskmm.EventQueries
    import org.junit.After
    import org.junit.Before
    import org.junit.Test
    import java.sql.DriverManager
    import java.sql.Connection
    
    
    class AndroidEventDatabaseTest {
        private lateinit var queries: EventQueries
    
        // When your test needs a driver
        @Before
        fun before() {
            val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)
    
            val database = EventDatabase(driver)
    
            EventDatabase.Schema.create(driver)
            queries = database.eventQueries
        }
    
    
        @Test
        fun `select all events`() {
            queries.insertEvent("1", "2", "{Click,Open}")
            queries.insertEvent("2", "2", "{Click,Close}")
    
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "2",
                        event_map = "{Click,Open}"
                    ),
                    Event(
                        as_counter = "2",
                        t_ms = "2",
                        event_map = "{Click,Close}"
                    )
                )
        }
    
        @Test
        fun `delete multiple events`() {
    
            queries.insertEvent("1", "1", "{Click,Open}")
            queries.insertEvent("1", "2", "{Click,Close},{Read,Open}")
            queries.insertEvent("1", "3", "{Click,Open}")
            queries.insertEvent("2", "3", "{Click,Open}")
    
            val event1 = listOf("1","3")
            val event2 = listOf("1","2")
            val event3 = listOf("1","4")
            val eventList = listOf(event1,event2,event3)
            for (event in eventList){
                queries.deleteEventListByKey(event.elementAt(0), event.elementAt(1))
            }
    
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "1",
                        event_map = "{Click,Open}"
                    ), Event(
                        as_counter = "2",
                        t_ms = "3",
                        event_map = "{Click,Open}"
                    ),
                )
    
        }
    
        @Test
        fun `delete single event`() {
    
            queries.insertEvent("1", "1", "{Click,Open}")
            queries.insertEvent("1", "2", "{Click,Close},{Read,Open}")
            queries.insertEvent("1", "3", "{Click,Open}")
            queries.insertEvent("2", "3", "{Click,Open}")
            queries.deleteEventListByKey("1", "3")
    
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "1",
                        event_map = "{Click,Open}"
                    ), Event(
                        as_counter = "2",
                        t_ms = "3",
                        event_map = "{Click,Open}"
                    ),
                    Event(
                        as_counter = "1",
                        t_ms = "2",
                        event_map = "{Click,Close},{Read,Open}"
                    )
                )
    
        }
    
        @Test
        fun `update events`() {
    
            queries.insertEvent("1", "2", "{Click,Open}")
            queries.insertEvent("1", "2", "{Click,Close}")
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "2",
                        event_map = "{Click,Close}"
                    )
                )
    
    
        }
    
    }
    
    参考资料 示例

    package com.viki.vikilitics_kmm
    
    import com.squareup.sqldelight.sqlite.driver.JdbcDriver
    import com.google.common.truth.Truth.assertThat
    import com.squareup.sqldelight.db.SqlDriver
    import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver
    import com.viki.vikiliticskmm.Event
    import com.viki.vikiliticskmm.EventQueries
    import org.junit.After
    import org.junit.Before
    import org.junit.Test
    import java.sql.DriverManager
    import java.sql.Connection
    
    
    class AndroidEventDatabaseTest {
        private lateinit var queries: EventQueries
    
        // When your test needs a driver
        @Before
        fun before() {
            val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)
    
            val database = EventDatabase(driver)
    
            EventDatabase.Schema.create(driver)
            queries = database.eventQueries
        }
    
    
        @Test
        fun `select all events`() {
            queries.insertEvent("1", "2", "{Click,Open}")
            queries.insertEvent("2", "2", "{Click,Close}")
    
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "2",
                        event_map = "{Click,Open}"
                    ),
                    Event(
                        as_counter = "2",
                        t_ms = "2",
                        event_map = "{Click,Close}"
                    )
                )
        }
    
        @Test
        fun `delete multiple events`() {
    
            queries.insertEvent("1", "1", "{Click,Open}")
            queries.insertEvent("1", "2", "{Click,Close},{Read,Open}")
            queries.insertEvent("1", "3", "{Click,Open}")
            queries.insertEvent("2", "3", "{Click,Open}")
    
            val event1 = listOf("1","3")
            val event2 = listOf("1","2")
            val event3 = listOf("1","4")
            val eventList = listOf(event1,event2,event3)
            for (event in eventList){
                queries.deleteEventListByKey(event.elementAt(0), event.elementAt(1))
            }
    
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "1",
                        event_map = "{Click,Open}"
                    ), Event(
                        as_counter = "2",
                        t_ms = "3",
                        event_map = "{Click,Open}"
                    ),
                )
    
        }
    
        @Test
        fun `delete single event`() {
    
            queries.insertEvent("1", "1", "{Click,Open}")
            queries.insertEvent("1", "2", "{Click,Close},{Read,Open}")
            queries.insertEvent("1", "3", "{Click,Open}")
            queries.insertEvent("2", "3", "{Click,Open}")
            queries.deleteEventListByKey("1", "3")
    
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "1",
                        event_map = "{Click,Open}"
                    ), Event(
                        as_counter = "2",
                        t_ms = "3",
                        event_map = "{Click,Open}"
                    ),
                    Event(
                        as_counter = "1",
                        t_ms = "2",
                        event_map = "{Click,Close},{Read,Open}"
                    )
                )
    
        }
    
        @Test
        fun `update events`() {
    
            queries.insertEvent("1", "2", "{Click,Open}")
            queries.insertEvent("1", "2", "{Click,Close}")
            assertThat(queries.selectAllEvents().executeAsList())
                .containsExactly(
                    Event(
                        as_counter = "1",
                        t_ms = "2",
                        event_map = "{Click,Close}"
                    )
                )
    
    
        }
    
    }
    
    参考资料

    谢谢你的回答!我遇到了另一个问题。“预期函数‘createDriver’在JVM的模块KMM.shared(test)中没有实际声明”。在KaMPKit项目中,我没有发现任何与JVM相关的东西。谢谢你的回答!我遇到了另一个问题。“预期函数‘createDriver’在JVM的模块KMM.shared(test)中没有实际声明”。在KaMPKit项目中,我没有发现任何与JVM相关的东西。