Это не баг, а запланированное поведение, но тем не менее сходу оно может попортить нервы тем, кто погружается в Espresso (как я).
Есть аннотация @Rule. Поля и методы с этой аннотацией выполняются до всех @Before и после всех @After. Поля выполняются до методов. Порядок полей и порядок методов при этом не определён, так что есть ещё RuleChain, но не об этом разговор.
Эталонный пример Правила — это ActivityTestRule. К примеру у меня это СплешАктивити. Я знаю, что она будет запущена и завершена до выполнения метода с аннотацией @Test и завершена после его выполнения. Так что в @After я пишу код, который удаляет данные приложения, будто это первый запуск.
Если выполнять методы @Test отдельно, то всё работает. Но если запустить все методы в классе, то все, кроме первого, завалятся, т.к. запущенная по правилу активити будет не той. Будто бы данные не удалены. Но они удалены!
Это происходит потому что запущенный на выполнение процесс приложения не перезапускается, пока не пройдут все тесты. То есть все @Before, @After — всё работает правильно, но процесс не увидит, что данные очищены, потому что он и не будет читать, т.к. он не перезапускается. Если воткнуть какое-нибудь System.exit(0), то тесты упадёт, т.к. процесс завершился.
Есть костыль, чтобы обойти это. Например, созданное правило для активити — выставить флаг запрета запуска, и запускать его вручную и вручную же завершать. Но если у вас несколько экранов, да ещё есть диалоги, да ещё с анимациями, то это не прокатит.
Более правильно — иметь что-то, что будет следить за процессом, но не будет зависеть от него и будет выполнять методы изолировано, с полным завершением процесса.
Можно написать скрипт, который будет на компе будет исполнять команды по-отдельности. Это вполне себе нормальный подход, я его применял когда-то и, возможно, ещё вернусь к нему. Но лучше (впрочем, одно другому не мешает) использовать оркестратор: https://developer.android.com/training/testing/junit-runner?hl=ru#using-android-test-orchestrator Он будет установлен как ещё одно приложение и берёт на себя то, что вы могли делать своими скриптами.
В документации сказано, что можно чистить данные вот такой инструкцией в гредле: testInstrumentationRunnerArguments clearPackageData: 'true'. Но учтите, что данные будут полностью очищаться перед каждым @Test. Если вам где-то надо чистить, а где-то не надо, то лучше реализуйте очистку вручную. Например, засуньте её в @After. Т.к. оркестратор завершает процесс после каждого теста, то с проблемой не перечитывания данных вы не столкнётесь.
Есть аннотация @Rule. Поля и методы с этой аннотацией выполняются до всех @Before и после всех @After. Поля выполняются до методов. Порядок полей и порядок методов при этом не определён, так что есть ещё RuleChain, но не об этом разговор.
Эталонный пример Правила — это ActivityTestRule. К примеру у меня это СплешАктивити. Я знаю, что она будет запущена и завершена до выполнения метода с аннотацией @Test и завершена после его выполнения. Так что в @After я пишу код, который удаляет данные приложения, будто это первый запуск.
Если выполнять методы @Test отдельно, то всё работает. Но если запустить все методы в классе, то все, кроме первого, завалятся, т.к. запущенная по правилу активити будет не той. Будто бы данные не удалены. Но они удалены!
Это происходит потому что запущенный на выполнение процесс приложения не перезапускается, пока не пройдут все тесты. То есть все @Before, @After — всё работает правильно, но процесс не увидит, что данные очищены, потому что он и не будет читать, т.к. он не перезапускается. Если воткнуть какое-нибудь System.exit(0), то тесты упадёт, т.к. процесс завершился.
Есть костыль, чтобы обойти это. Например, созданное правило для активити — выставить флаг запрета запуска, и запускать его вручную и вручную же завершать. Но если у вас несколько экранов, да ещё есть диалоги, да ещё с анимациями, то это не прокатит.
Более правильно — иметь что-то, что будет следить за процессом, но не будет зависеть от него и будет выполнять методы изолировано, с полным завершением процесса.
Можно написать скрипт, который будет на компе будет исполнять команды по-отдельности. Это вполне себе нормальный подход, я его применял когда-то и, возможно, ещё вернусь к нему. Но лучше (впрочем, одно другому не мешает) использовать оркестратор: https://developer.android.com/training/testing/junit-runner?hl=ru#using-android-test-orchestrator Он будет установлен как ещё одно приложение и берёт на себя то, что вы могли делать своими скриптами.
В документации сказано, что можно чистить данные вот такой инструкцией в гредле: testInstrumentationRunnerArguments clearPackageData: 'true'. Но учтите, что данные будут полностью очищаться перед каждым @Test. Если вам где-то надо чистить, а где-то не надо, то лучше реализуйте очистку вручную. Например, засуньте её в @After. Т.к. оркестратор завершает процесс после каждого теста, то с проблемой не перечитывания данных вы не столкнётесь.
Android Developers
AndroidJUnitRunner | Android Developers
Новая фича у Пикселей. По крайней мере в Pixel 2 её раньше не было
Ошибка взаимодействия сервиса звонилки и приложения звонилки в Android. Словил на Pixel 2 на Android 10
1. При активном звонке отстреливаем приложение звонилки. В моём случае достаточно было запустить тяжёлое приложение, чтобы система выгрузила звонилку
2. Т.к. сервис продолжает работать, мы слышим, что звонок всё ещё живой
3. Запуск звонилки никак не влияет на установленное подключение. Звонилка не видит активного звонка и позволяет совершить ещё один звонок
В моём случае я звонил в Hoff и там не брали трубку по полчаса. И я не мог завершить зависший звонок, пришлось ребутать устройство, потому что сервис продолжал держать установленный звонок и я слушал музыку и "ваш звонок дохера важен для нас".
1. При активном звонке отстреливаем приложение звонилки. В моём случае достаточно было запустить тяжёлое приложение, чтобы система выгрузила звонилку
2. Т.к. сервис продолжает работать, мы слышим, что звонок всё ещё живой
3. Запуск звонилки никак не влияет на установленное подключение. Звонилка не видит активного звонка и позволяет совершить ещё один звонок
В моём случае я звонил в Hoff и там не брали трубку по полчаса. И я не мог завершить зависший звонок, пришлось ребутать устройство, потому что сервис продолжал держать установленный звонок и я слушал музыку и "ваш звонок дохера важен для нас".
JFYI: PIA (https://www.privateinternetaccess.com/) приложение под Android обновилось. Завезли поддержку WireGuard, наконец.
Privateinternetaccess
Private Internet Access: The Best VPN Service For 10+ Years
PIA VPN is 2026's top-rated VPN service – with ultra-fast speeds, worldwide streaming servers, and 100% open-source software. Try PIA risk free for 30 days.
Мой баг дня (записки тестировщика)
JFYI: PIA (https://www.privateinternetaccess.com/) приложение под Android обновилось. Завезли поддержку WireGuard, наконец.
У меня не завелось на Android, лол. Не подклчается. Pixel 2, Android 10. Хотя они честно пишут, что это превью. Взятки гладки, так сказать. Но когда заработает, я сделаю замеры скорости. Т.к. в 10ке оно всё равно работает в юзер спейсе, то буст должен быть не сильный. Но проверю.
Переустановка решила проблему. Вот результаты сравнения. Нижний — WireGuard, верхний — openVPN
Для сравнения. Вообще без VPN значения 129 и 73 соотвественно.
Столкнулись с проблемой: программа не запускалась у некоторых пользователей. Что их объединяло — RDP и Windows 7. Пробовали — проблема воспроизводится.
Чуть-чуть Гугла и выяснилось то, что некоторые из вас и так знали (но не я). Как оказалось, если Win7 используется в качестве RDP сервера, то на ней нельзя задействовать openGL, из-за чего ваши программы, написанные с использованием Qt, могут просто падать.
Чуть-чуть Гугла и выяснилось то, что некоторые из вас и так знали (но не я). Как оказалось, если Win7 используется в качестве RDP сервера, то на ней нельзя задействовать openGL, из-за чего ваши программы, написанные с использованием Qt, могут просто падать.
Screenshot_20200504_161621.png
4.2 KB
Лол. Эпл, по крайней мере для моего тестового iPhone SE, впаяла ровно 32 гигабайта памяти. Ни байтом больше или меньше
И да, речь о GB, а не о GiB. Это Windows неправильно пишет GB. В MS, почему-то, не желают использовать нормальные единицы измерения.
Такое-то качество, теперь от Google.
Приложение Google Photos, установленное из Маркета на Pixel 2 с Android 10 без модификаций.
Достаточно иметь тёмную тему в системе (штатно), чтобы видеть такое вот
Приложение Google Photos, установленное из Маркета на Pixel 2 с Android 10 без модификаций.
Достаточно иметь тёмную тему в системе (штатно), чтобы видеть такое вот
Screenshot_20200618_100814.png
40.1 KB
Тинькофф, так «й» или «и»?