Unit testing 如何在KMM上为SQLDelight编写单元测试
我想知道如何在KMM上为SQLDelight编写单元测试。首先,我甚至不能正确添加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"))
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相关的东西。