E/TestRunner:android.database.sqlite.SQLiteException:没有这样的 table:已审查(代码 1 SQLITE_ERROR)
E/TestRunner: android.database.sqlite.SQLiteException: no such table: Censored (code 1 SQLITE_ERROR)
我有一个 Android 应用程序,其中包含 50 多个 Espresso 测试用例。大多数时候测试工作正常,但在某些运行期间,一个测试用例(只有一个)因缺少数据库而失败 table。所有其他测试用例都正确使用此 table。有时报错信息不同,如:
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 522 SQLITE_IOERR_SHORT_READ)
代码示例可应要求提供,但它是一个庞大的应用程序,所以我怀疑我能否将其全部放入 post。
我是否应该将 tablet 替换为不会丢弃我的位的一个?
另一个建议是我可以预热一个虚拟 Android 设备,看看那里是否发生错误。
不 - 该错误偶尔也会发生在虚拟 tablet 上。大概是使用昂贵的 ThinkPad 存储,而不是我便宜的 ONA tablet 的存储。
我无法 post 获取此信息的原因(这只是 Espresso 和 Room 代码的书本),因为当我的应用程序很小时,问题就不会发生。只有增加应用程序才会出现问题。
测试数据库使用真实文件,在getExternalFilesDir()
文件夹中;不是内存数据库。并且切换到 getFilesDir()
文件夹并没有修复 SQLite 文件损坏错误。 (反正我也没有挂载SD卡。)
但是看这里,在数据库的构建器中:buildee.allowMainThreadQueries()
。
由于您提供的代码或测试细节很少,所以很难回答但是
我会检查测试的 运行ning 顺序,看看失败时是否有不同,因为您的应用程序可能不在您认为测试失败时应该处于的状态。您可以添加一些预先 activity 设置以确保数据库处于正确的状态以 运行 随机失败的测试。
请参考对您有帮助的link。
并且您是否在项目中使用了外部存储目录?
如果是,则遵循 this。
我认为有两种可能:
- 可能设备上的文件系统有问题。
- 您的应用程序在外部存储目录中,并且在使用此应用程序的测试中 space SD 卡被移除或没有足够的 space 这就是 SQLite 抛出此错误的原因。
希望对你有所帮助....!
当您遇到腐败来来去去并以不同形式出现的错误时,您就会遇到竞争条件。那么谁在比赛?
Android Espresso,遵循 Java 生态系统对线程滥用的嗜好,运行 在与 Android UI 线程分开的线程中进行测试. (这违反了规则"UI tests should treat UI objects like objects.")
但是,如果数据库 运行 正在该线程中运行,则测试的汇编代码(创建要测试的数据库对象)正在与 UI 线程竞争。
解决方案是 运行 在 @UiThreadTest
内进行尽可能多的测试。这需要丢弃所有 Espresso onView()
BS 并直接访问视图对象。
根据 ,在代码周围添加一些 db.close()
也有帮助。
将测试切换为使用 Room.inMemoryDatabaseBuilder()
似乎也有帮助。
外部问题仍然存在:是否有人编写过调用 Room 数据库的 Espresso 测试,直到烟雾像这样从他们的设备中滚出?还是我真的是第一个?
我有一个 Android 应用程序,其中包含 50 多个 Espresso 测试用例。大多数时候测试工作正常,但在某些运行期间,一个测试用例(只有一个)因缺少数据库而失败 table。所有其他测试用例都正确使用此 table。有时报错信息不同,如:
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 522 SQLITE_IOERR_SHORT_READ)
代码示例可应要求提供,但它是一个庞大的应用程序,所以我怀疑我能否将其全部放入 post。
我是否应该将 tablet 替换为不会丢弃我的位的一个?
另一个建议是我可以预热一个虚拟 Android 设备,看看那里是否发生错误。
不 - 该错误偶尔也会发生在虚拟 tablet 上。大概是使用昂贵的 ThinkPad 存储,而不是我便宜的 ONA tablet 的存储。
我无法 post 获取此信息的原因(这只是 Espresso 和 Room 代码的书本),因为当我的应用程序很小时,问题就不会发生。只有增加应用程序才会出现问题。
测试数据库使用真实文件,在getExternalFilesDir()
文件夹中;不是内存数据库。并且切换到 getFilesDir()
文件夹并没有修复 SQLite 文件损坏错误。 (反正我也没有挂载SD卡。)
但是看这里,在数据库的构建器中:buildee.allowMainThreadQueries()
。
由于您提供的代码或测试细节很少,所以很难回答但是
我会检查测试的 运行ning 顺序,看看失败时是否有不同,因为您的应用程序可能不在您认为测试失败时应该处于的状态。您可以添加一些预先 activity 设置以确保数据库处于正确的状态以 运行 随机失败的测试。
请参考对您有帮助的link。 并且您是否在项目中使用了外部存储目录?
如果是,则遵循 this。
我认为有两种可能:
- 可能设备上的文件系统有问题。
- 您的应用程序在外部存储目录中,并且在使用此应用程序的测试中 space SD 卡被移除或没有足够的 space 这就是 SQLite 抛出此错误的原因。
希望对你有所帮助....!
当您遇到腐败来来去去并以不同形式出现的错误时,您就会遇到竞争条件。那么谁在比赛?
Android Espresso,遵循 Java 生态系统对线程滥用的嗜好,运行 在与 Android UI 线程分开的线程中进行测试. (这违反了规则"UI tests should treat UI objects like objects.")
但是,如果数据库 运行 正在该线程中运行,则测试的汇编代码(创建要测试的数据库对象)正在与 UI 线程竞争。
解决方案是 运行 在 @UiThreadTest
内进行尽可能多的测试。这需要丢弃所有 Espresso onView()
BS 并直接访问视图对象。
根据 db.close()
也有帮助。
将测试切换为使用 Room.inMemoryDatabaseBuilder()
似乎也有帮助。
外部问题仍然存在:是否有人编写过调用 Room 数据库的 Espresso 测试,直到烟雾像这样从他们的设备中滚出?还是我真的是第一个?