E / TestRunner: android.database.sqlite.SQLiteException: нет такой таблицы: цензура (код 1 SQLITE_ERROR) - PullRequest
0 голосов
/ 20 октября 2019

У меня есть приложение для Android с более чем 50 тестовыми наборами для эспрессо. Большую часть времени тесты работают правильно, но во время некоторых прогонов один тестовый случай (только один) завершается неудачно с отсутствующей таблицей базы данных. Все остальные тестовые примеры используют эту таблицу правильно. Иногда сообщение об ошибке отличается, например:

android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 522 SQLITE_IOERR_SHORT_READ)

Примеры кода доступны по запросу, но это большое приложение, поэтому я сомневаюсь, что смогу вписать все это в сообщение.

Стоит ли просто заменить планшет на тот, который не выбрасывает мои биты?


Еще одно предложение: я могу прогреть виртуальное устройство Android и посмотреть, не произошла ли там ошибка.


Нет - ошибка также иногда возникает на виртуальном планшете. Предположительно, с дорогим хранилищем ThinkPad, а не с дешевым хранилищем на моем планшете ONA.

Причина, по которой я не могу опубликовать исходный код для этого (это просто эспрессо и код комнаты, делают это), - это когда мое приложение быломаленькая проблема не случилась. Только растущее приложение позволило решить проблему.

Тестовая база данных использует реальный файл в папке getExternalFilesDir();не база данных в памяти. А переключение на папку getFilesDir() не исправило ошибки, связанные с повреждением файлов SQLite. (У меня все равно нет подключенной SD-карты.)


Но посмотрите здесь, в сборщике базы данных: buildee.allowMainThreadQueries().

Ответы [ 3 ]

0 голосов
/ 21 октября 2019

Пожалуйста, обратитесь к ссылке , которая вам поможет. И вы используете каталог внешнего хранилища в вашем проекте?

Если да, то следуйте этому .

По моему мнению, есть две возможности:

  • Возможно, в файловой системе устройства есть какие-то проблемы.
  • Ваше приложение находилось в каталоге внешнего хранилища, иSD-карта была удалена или недостаточно места в тестируемом телефоне с помощью этого приложения, поэтому SQLite выдает эту ошибку.

Надеюсь, это поможет вам ....!

0 голосов
/ 22 октября 2019

Если у вас есть ошибка, когда коррупция приходит и уходит и появляется в разных формах, у вас есть состояние гонки. Так кто же участвует в гонках?

Android Espresso, следуя склонности Java-экосистемы к злоупотреблению потоками, запускает свои тесты в отдельном от потока пользовательского интерфейса Android. (Это нарушает правило: «Тесты пользовательского интерфейса должны обрабатывать объекты пользовательского интерфейса как объекты».)

Но если база данных работает в этом потоке, то код сборки тестов, создающий объекты базы данных для тестирования, работает сПоток пользовательского интерфейса.

Решение запускает как можно больше тестов внутри @UiThreadTest. А для этого нужно отбросить все Espresso onView() BS и просто получить прямой доступ к объектам вида.


Per Комната, не создающая базу данных в UI-Tests , разбросанная вокруг db.close()Код также помог.

Переключение тестов на использование Room.inMemoryDatabaseBuilder() также, кажется, помогает.


Внешний вопрос остается: Кто-нибудь писал тесты эспрессо, которые вызывали базу данных Room додым выкатился из их устройства, как это раньше? Или я действительно первый?

0 голосов
/ 21 октября 2019

Поскольку вы даете очень мало подробностей о коде или тестах, трудно ответить, НО

Я бы проверил порядок выполнения тестов, чтобы увидеть, отличается ли он в случае сбоя, поскольку ваше приложение может этого не делатьбыть в том состоянии, которое, как вы думаете, должно быть, когда тест не пройден. Вы можете добавить некоторые предварительные настройки, чтобы убедиться, что база данных находится в правильном состоянии для запуска теста, который случайно завершается неудачей.

...