Событие пользователя TouchUtils и ActivityInstrumentationTestCase2 модульного теста не работает - PullRequest
1 голос
/ 31 марта 2012

В настоящее время я немного борюсь со структурой модульного тестирования ...

что я пытаюсь сделать

  • Мне нужно смоделировать 2 щелчка по экрану (100 100) и (400 400) с небольшой разницей в продолжительности.
  • Мне нужно смоделировать длинное нажатиеНажмите на экран Допустим, (200, 200)
  • При щелчке пользователя запускается собственный код и выполняется обработка пикселей на растровом изображении.
  • Этот тест будет выполняться для нескольких парных наборов точек для анализа производительности системы во время выполнения

Вот где я застрял

  • Я использую ActivityInstrumentationTestCase2 и touchUtils для событий щелчка пользователя.
  • TouchUtils.longClickView (тест InstrumentationTestCase, View v) работает нормально; Я могу быстро обнаружить событие длительного нажатия, но тестовый пример завершается еще до завершения вычислений / рендеринга в моем потоке пользовательского интерфейса; как мне остановить выход теста в этом случае?
  • Как мне смоделировать 2/3 пользовательских кликов @ в определенном месте на экране? причина TouchUtils.clickView (тест InstrumentationTestCase, View v) будет только симулировать щелчок пользователя в центре экрана ... Как это сделать правильно?

Это то, что я пробовал, и, кажется, я что-то упускаю:

  • TouchUtils.longClickView (тест InstrumentationTestCase, View v) отлично работает ... для создания longClickView .. Даже я смог создать longClickView () в определенном месте экрана, введя временную задержку между ACTION_DOWN и событием ACTION_UP .. пожалуйста, обратитесь к код прикреплен
  • Мне удалось добиться события щелчка пользователя в определенном месте на экране, но я столкнулся со странной проблемой .. Когда я отправляю MotionEvent (100,100) из тестового примера. Каркас всегда добавляет «-76» в событии Y .. не уверен, почему произошло это отклонение ... я обошел проблему, добавив 76 к своим входным данным (100,176) на некоторое время .. кто-нибудь сталкивался с подобной проблемой?
  • Даже при таком подходе время кажется очень важным ... как будто я помещаю большую задержку между ACTION_DOWN и ACTION_UP, событие определяется как longClickPress ... и если я помещаю немного меньше ... "второй" одиночный щелчок события (ACTION_DOWN + ACTION_UP) обнаруживаются как DoubleTapEvent ..

Какая должна быть правильная временная комбинация для ACTION_UP и ACTION_DOWN .. для имитации события клика одного пользователя .. ????????

    @Test
    public void testClick(){
    List<Points> pointSequence = new ArrayList<Points>();
    Log.d(TAG, "FirClick Start Timing : " + SystemClock.uptimeMillis());

    pointSequence.add(new Points(100f,176f));
    pointSequence.add(new Points(100f,176f));       
    singleClickSimulation(pointSequence,false);
    }       

    private void singleClickSimulation(List<Points> pointSequence, Boolean addDelay) {

    long downTime = SystemClock.uptimeMillis();
    long eventTime = SystemClock.uptimeMillis();
    // NOTE : If I do not place this then the event is detected as doubleTap.
    eventTime += 100;
    Instrumentation inst = getInstrumentation();

    MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, pointSequence.get(0).getX(), pointSequence.get(0).getY(), 0);
    inst.sendPointerSync(event);                
    //eventTime = SystemClock.uptimeMillis();
    pointSequence.remove(0);        

    //This delay I have added just to test; whether there is enough time for pixel manipulation or not, actually it would be used only at the end of the run of all the test cases for single user click
    if(addDelay){
    eventTime = SystemClock.uptimeMillis() + 3000;
    }
    eventTime += 25;
    event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, pointSequence.get(0).getX(), pointSequence.get(0).getY(), 0);
    inst.sendPointerSync(event);
    pointSequence.remove(0);
}

Ответы [ 2 ]

0 голосов
/ 29 сентября 2015

вместо использования TouchUtils, я использовал.

public class TestTouchUtils extends   ActivityInstrumentationTestCase2<TheActivity> {

    public void testTouchUtils() throws Throwable {

        final View button = getActivity().findViewById(R.id.button)

        getActivity().runOnUiThread( new Runnable() {
             public void run() {
                button.performClick();
             }
        });
    }
}

Он не будет обновлять пользовательский интерфейс на приборе / устройстве, но обновит переменную в приборе.В моем случае кнопка обновления адаптера фрагмента.Если я использую только TouchUtils.clickView (эта кнопка), пользовательский интерфейс на устройстве обновляется, но переменная не обновляется.

Так что я тоже комбинирую с TouchUtils.Я не знаю почему, но это сработало.

0 голосов
/ 05 апреля 2012

Частичный ответ:

еще предстоит найти причину отклонения 76px при создании событий щелчка пользователя.

Мне удалось смоделировать одно нажатие пользователя с разницей в 50 мс. И я должен был сделать 2 клика по крайней мере 300 мс; так что «SingleTapConfirmed» может запускаться самостоятельно для класса GeastureDetector ..

private void singleClickSimulation(List<Points> pointSequence,boolean addDelay) {

    long downTime = SystemClock.uptimeMillis();
    // event time MUST be retrieved only by this way!
    long eventTime = SystemClock.uptimeMillis();

            // This additional time was added between 2 successive clicks 
            // to make sure that "singleTapConfirmed" event can get fired for "GeastureDetector" class.
    eventTime +=400;
    downTime +=400;
    Instrumentation inst = getInstrumentation();

    MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, pointSequence.get(0).getX(), pointSequence.get(0).getY(), 0);
    inst.sendPointerSync(event);                
    //eventTime = SystemClock.uptimeMillis();
    pointSequence.remove(0);        


            //50 ms timedelay between ACTION_DOWN and ACTION_UP works well      
    eventTime += 50;
    event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, pointSequence.get(0).getX(), pointSequence.get(0).getY(), 0);
    inst.sendPointerSync(event);
    pointSequence.remove(0);
}
...