Тест Robotium UI для приложения с навигационным ящиком
Мы получили приложение с Navigation Drawer
из библиотеки support.v4
. Мы автоматизируем тестирование пользовательского интерфейса с помощью Robotium
, и все в порядке, но Navigation Drawer
может зависеть случайным образом, чтобы некоторые тесты могли случайно произойти.
Это определенно не проблема Robotium
, потому что я видел, как Navigation Drawer
зависает в некоторых других приложениях на моем устройстве, а также в моих собственных приложениях.
Я уже испробовал исправление для Navigation Drawer
из этого вопроса anwer: Почему DrawerLayout иногда сбой при открытии?
Это помогло, и случайные зависания уменьшились с 90% до 10%, но 10% тестовых прогонов могут потерпеть неудачу, и это очень плохо, особенно для непрерывной интеграции...
Возможно, кто-то уже исправил эту проблему?
Ответы
Ответ 1
Я столкнулся с той же проблемой с нашими испытаниями Robotium, и решение, с которым я столкнулся, состояло в том, чтобы имитировать жест перетаскивания (как реальный пользователь пропустил бы ящик ящика) вместо того, чтобы пытаться щелкнуть переключатель ящика или использовать solo
методов. Кажется, я часто замечал прерывистые сбои на устройствах под управлением Android старше SDK 18.
Я поместил этот метод в наш собственный подкласс solo
, и у нас не было теста с ошибкой, так как (более сотни прогонов).
/**
* Open the navigation drawer with a drag gesture. Click based triggering is
* flaky on SDK < 18
*/
public void openNavigationDrawer() {
Point deviceSize = new Point();
getCurrentActivity().getWindowManager().getDefaultDisplay().getSize(deviceSize);
int screenWidth = deviceSize.x;
int screenHeight = deviceSize.y;
int fromX = 0;
int toX = screenWidth / 2;
int fromY = screenHeight / 2;
int toY = fromY;
this.drag(fromX, toX, fromY, toY, 1);
}
Ответ 2
Я тоже использую android.support.v4.widget.DrawerLayout
и не нашел способ сделать это просто.
Мне наконец удалось открыть ящик, используя следующий ниже код
/**
* As we use app compat it seems Solo#setNavigationDrawer is not doing well
* (drawer does not open, but the button is clicked)
*
* Same result for clickOnView(getView(android.R.id.home))
*
* This code opens the navigation drawer on the main thread
* Be aware : you need to provide your DrawerLayout id (you can do it in params)
*/
public void openCompatNavigationDrawer() {
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
((DrawerLayout) mSolo.getView(R.id.drawer_layout))
.openDrawer(Gravity.LEFT);
}
});
}
Gist доступен здесь https://gist.github.com/quentin7b/9b51a3827c842417636b
Ответ 3
Откройте навигацию на ящике: solo.clickOnScreen(50, 50);
Выберите элемент списка в навигации ящика:
ListView listView = (ListView) solo.getView(R.id.left_drawer);
View SwitchOrganizations = listView.getChildAt(0);
solo.clickOnView(SwitchOrganizations);