Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • Feb 18 2017 16:44
    User @rus-speaking unbanned @ImangazalievM
  • Oct 20 2016 21:53
    @rus-speaking banned @ImangazalievM
  • Oct 12 2016 11:36
    @rus-speaking banned @postflow
  • Jan 31 2016 12:15
    @rus-speaking banned @Nikkola
  • Dec 01 2015 16:39
    @rus-speaking banned @StNekroman
  • Nov 15 2015 20:35
    User @rus-speaking unbanned @skilz2012 from this room
  • Nov 11 2015 12:31
    @rus-speaking banned @skilz2012
Vadim Morozov
@mnewlive
@moonsweel то есть что то из этой рубрики
 val presenter = UnlockAppPresenter(this)
        presenter.getTimeFromLastPinInput()
        saveLastPinInputTime(10L)

        assertThat(presenter.getTimeFromLastPinInput(), equalTo(DateTime.now().millis - 10L))
Rustem Saitkulov
@atetc
Как минимум можно так метод переделать getTimeFromLastPinInput(DateTime.now().millis) или свой класс getTimeFromLastPinInput(dateTimeProvider) который легко мокается
moonsweel
@moonsweel
@atetc да не, я думаю, можно пренебречь миллисекундной точностью и оставить DateTime
Vadim Morozov
@mnewlive

Кто сталкивался?

com.sai.android.acceptanceTests.more.ContactSupportScreenTest > checkOnBackClick[emu_19_WXGA720(AVD) - 5.0.2] FAILED 
Test failed to run to completion. Reason: 'Instrumentation run failed due to 'Native crash''. Check device logcat for details
Tests on emu_19_WXGA720(AVD) - 5.0.2 failed: Instrumentation run failed due to 'Native crash'
:app:connectedAcceptanceDebugAndroidTest FAILED

при запуске espresso тестов, выскакивает этот Native Crash

Kirill Ashikhmin
@KirillAshikhmin
@mnewlive Check device logcat for details - что в логкате сказано?
Vadim Morozov
@mnewlive
Valeriy Miller
@Str4tocaster
Привет, коллеги! Столкнулся со следущей проблемой - при старте приложения, интерфейс иногда немного подтупливает. Иногда отображает алерт "приложение не отвечает". Но повторяемость не 100%. Проблема то наблюдается, то нет. Не знаю как ее локализовать. Можете подсказать инструменты или статьи для того, чтобы выявить конкретный участок кода, который тормозит ui. PS: на первый взгляд, операций с базой/сетью в main-треде не увидел. Спасибо за помощь!
ViTORossonero
@ViTORossonero
вот еще https://github.com/frogermcs/AndroidDevMetrics
но это для Dagger2 + lifecycle methods
Valeriy Miller
@Str4tocaster
@ViTORossonero спасибо! посмотрю
Taras
@tarikb
@Str4tocaster android.os.StrictMode поможет отловить часть не нужной активности в мейн треде
Nikolai Senchurin
@try2bajed1
@try2bajed1
скажите,а с роболектриком работать это всегда больно? То мультидекс, то ресурсы, то стили для активити... Ожидает ли радость после всех кругов ада? Или же есть альтернативы? а то мне не удалось ни одного теста прогнать на этм фреймворке...
как лечить No such manifest file: build/intermediates/manifests/full/debug/src/main/AndroidManifest.xml
Rustem Saitkulov
@atetc
@try2bajed1
packageName забыли указать?
И не обязательно Robolectric для всех кейсов с классами платформы использовать, можно мокнутые классы использовать просто с Unit тестами
Nikolai Senchurin
@try2bajed1
продублирую сообщение из тулзов. В общем пробуем настроить CI.
как правильно написать в *.yml , чтобы пакеты у меня не качались каждый раз заново?
  • echo y | ~/cache/sdk/tools/android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}
    • echo y | ~/cache/sdk/tools/android --silent update sdk --no-ui --all --filter platform-tools
    • echo y | ~/cache/sdk/tools/android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}
    • echo y | ~/cache/sdk/tools/android --silent update sdk --no-ui --all --filter extra-android-m2repository
    • echo y | ~/cache/sdk/tools/android --silent update sdk --no-ui --all --filter extra-google-m2repository
    • echo y | ~/cache/sdk/tools/android --silent update sdk --no-ui --all --filter extra-google-google_play_services
      когда стартует tools/android update sdk... - он спрашивает "а ты согласен?" в этом основная беда. и ещё он каждый раз скачивает пакеты при такой команде, даже если они уже установлены и мне пока не понятно как их кэшировать...
      может еще какие хитрые комманды и флаги есть
а то локально юниттесты сейчас прогоняются за 10 сек, а на сервере после каждого залития ветки , обновления мавеновских реп, гуглсервисов итд это затягивается на 5мин
Akbolat Sadvakassov
@iRYO400
Народ, в чем заключается польза UI тестов? Можете перечислить реальные примеры с которыми вы сталкивались или ваши коллеги...
Заранее Спасибо!
Kirill Ashikhmin
@KirillAshikhmin
@iRYO400 кривое отображение на каком-то девайсе, некорректно отрабатывают тапы, что-то не показывается или не там и т.д. Плюс проверка корректности всех ползовательских сценариев и переходов между экранами.
Dmitriy Antipov
@THEb0nny
Ребята, я все активити могу getDecorView() выполнить?
Vadim Morozov
@mnewlive

Есть некий data class в котором у меня содержаться два параметра.
В презентере объявляю следующим образом:

SwitcherItem(R.string.some, true)

В unit'e же пробую проверить сначала текст

assertEquals((R.string.some), items[7] as SwitcherItem)

но ошибка мол на поверку двух параметров я так понимаю
java.lang.AssertionError: expected:<2131297241> but was:<SwitcherItem(titleId=2131297241, clickable=true)> at org.junit.Assert.fail(Assert.java:88)

всё чётко)
решил следующим образом
 assertEquals(SwitcherItem(R.string.some, true), items[7] as SwitcherItem)
Vadim Morozov
@mnewlive
С чего начать, пробуя протестировать подобный метод?
fun decodeImageResource(imageResId: Int): Bitmap? {
    try {
        val options = BitmapFactory.Options().apply { inScaled = false }
        return BitmapFactory.decodeResource(AppResources.appContext?.resources, imageResId, options)
    } catch (e: Exception) {
        e.log()
    }
    return null
}
Dmitry Ikryanov
@HD97300
@mnewlive тестировать SDK?
moonsweel
@moonsweel
и вообще странный метод
зачем исключение перехватывать?
Vadim Morozov
@mnewlive
@HD97300 вопрос с SDK не понятен.
А блок try/catch добавляем, чтобы отловить ошибку, в случае если с картинкой будет какая то лажа
moonsweel
@moonsweel
@mnewlive какая лажа?
Vadim Morozov
@mnewlive
@HD97300 вы зайдите в сам метод decodeResource там уже по умолчанию стоит try catch
  • дополнительно могут быть и npe и leak.
    поэтому собственно он здесь ну никак не лишний
Dmitry Ikryanov
@HD97300
@mnewlive зачем тестировать методы SDK? В расчете, что инженеры Google не тестируют свои методы?
Что даст данный тест? Тестировать нужно свое API, а не чужое.
moonsweel
@moonsweel
дополнительно могут быть и npe и leak
в каких случаях?
Mike
@mikekudzin
комрады, есть ли апи для того, что бы дождаться main looper idle как делает эспрессо, только в произвольный момент времени. Что-то вроде View view = new View(context); \n victim.doSomeOperationsOn(view); \n waitUntilMainThreadIdle(); \n assertVictimState(victim);
Akbolat Sadvakassov
@iRYO400
Ку!
Хелпаните, читаю туториалы про тестирование. В процессе возник вопрос, сколькими инструментами нужно делать все эти тесты?
Вижу, чувак пишет про JUnit4, потом зачем-то использует либу Мокито
затем из ниоткуда появляется RoboElectric
смысл такого парка инструментов тестрования?
ладно Esspresso, он там с UI тестит
moonsweel
@moonsweel
junit, mockito, mockwebserver, espresso
Mike
@mikekudzin
@iRYO400 JUnit4 - фреймворк для юнит-тестов. По идее, тут должна тестироваться вся бизнес логика (она не должна зависить от классов фреймворка, если следовали DI принципу при разработке). Мокито - библиотека для удобного создания mock объектов, Robolectric - библиотека для запуска instrumentation tests (те самые андроид-тесты, где тестируется активити, ui и прочее) без устройства или эмулятора, т.е. в обычном java процессе.

отвечаю на свой вопрос: вариант 1

private void waitUntilIdle() throws Exception {
        final Object threadMonitor = new Object();
        Looper.getMainLooper().getQueue().addIdleHandler(new MessageQueue.IdleHandler() {
            @Override
            public boolean queueIdle() {
                synchronized (threadMonitor) {
                    threadMonitor.notify();
                }
                return false;
            }
        });
        synchronized (threadMonitor) {
            threadMonitor.wait();
        }
    }

вариант 2 красивее:

InstrumentationRegistry.getInstrumentation().waitForIdleSync();
Akbolat Sadvakassov
@iRYO400
@mikekudzin оки. спс
По поводу Dagger 2, можно ли использовать код, который он сгенерил, в тестах или нужно писать "тестовые"(в test пакетах) версии модулей/компонентов?
Vadim Morozov
@mnewlive

Затык
Как в ожидаемом значении ипользовать isNotDefault параметр?

assertThat((fragment.arguments.getSerializable(KEY_FILTER) as? BaseFilter)?.isDefault,
                equalTo(!BaseFilter(FilterType.CATEGORY_BREAKDOWN).isDefault))

Не могу втыкнуть куда в первой части правильно втыкнуть этот восклицательный знак))

Vadim Morozov
@mnewlive
Или так тоже прокатит?)
assertFalse(!BaseFilter(FilterType.CATEGORY_BREAKDOWN).isDefault)
artycorp
@artycorp

Добрый день, коллеги!
подскажите по unit тестированию. На сколько кошерно писать функцию вместо явной инициализации. Пример - есть контейнер, в него помещается три элемента.
Правильно будет помещать в контейнер каждый раз реальные значений или можно обойтись одной функцией.
т.е.:

void test1(){
add_three_values();
....
работа с данными
}

void test2(){
add_three_values();
....
работа с данными
}

или

void test1(){
add_1("a","b","c");
add_2("d","e","f");
add_3("g","h","j");
}
void test2(){
add_1("a","b","c");
add_2("d","e","f");
add_3("g","h","j");
}
Из минусов add_three_values - в случае ошибки все тесты будут успешны. При 2м варианте, часть тестов свалится, ошибку можно будет обнаружить. Но при этом качество кода ниже и куча дублирования. Ну и обратный вариант актуальность тестов, часть со старыми данными будут.
MayyaLitvina
@MayyaLitvina

Senior / Middle Android-разработчик (Москва)
190 000 руб.

О ПРОЕКТЕ:
Наш сервис позволяет пользователю осуществить свою материальную мечту и наблюдать за этим в режиме реального времени

ОБЯЗАННОСТИ:
Доработка и поддержка мобильного клиент-серверного приложения и внедрение новых функций
Адаптация приложения под различные форматы устройств.

ВАШ ОПЫТ:
Опыт коммерческой разработки от 2-х лет и знание специфики разработки под разные версии Android (версии 4 и выше).
Уметь верстать интерфейсы и создавать интерфейсные анимации.
Знание библиотек Retrofit 2, RxJava (желателен), Dagger 2. Realm.
Желательно опыт работы с sdk соц сетей.

ЧТО ПРЕДЛАГАЕМ:
5/2, гибкий рабочий день (8 часов), метро «Трубная» и «Цветной бульвар».
возможность поучаствовать в интересном и перспективном проекте.

ДЕТАЛИ тут: https://bit.ly/2Op09L6
Контакты: tanyazaj@gmail.com

mykola-tarchanyn
@mykola-tarchanyn
всем привет, застрял на етом вопросе https://stackoverflow.com/q/52334921/5197266