2012-03-30 9 views
1

Derzeit ich ein wenig mit dem Unit-Test Framework habe Schwierigkeiten ...TouchUtils und ActivityInstrumentationTestCase2 Benutzerereignis Einheit Testfall nicht funktioniert

was ich

  • zu tun versuche, brauche ich 2 zu simulieren klickt auf den Bildschirm (100,100) und (400,400) mit einer kleinen Zeitdifferenz.
  • Ich muss ein longPressClick auf dem Bildschirm simulieren Lassen Sie uns sagen (200, 200)
  • Nach Benutzer klicken Sie auf den nativen Code ausgeführt wird und führt Pixel-Manipulation auf Bitmap.
  • Dieser Test zur Analyse der Laufzeit-Performance des Systems wird für mehr Paar-Sätze von Punkten laufen

hier, wo ich

  • I und touchUtils bin mit activityInstrumentationTestCase2 steckte Für den Benutzer klicken Sie auf Ereignisse.
  • TouchUtils.longClickView (InstrumentationTestCase Test, View v) funktioniert gut; Ich bin in der Lage, das lange dringende Ereignis zu erkennen, aber der Test wird beendet, noch bevor die Berechnung/Darstellung in meinem UI-Thread abgeschlossen ist. Wie kann ich den Test in diesem Fall beenden?
  • Wie simuliere ich 2/3 Benutzerklicks @ bestimmten Ort auf dem Bildschirm? Ursache TouchUtils.clickView (InstrumentationTestCase-Test, Ansicht v) würde nur den Benutzerklick in der Mitte des Bildschirms simulieren ... Wie man es richtig macht?

Dies sind die Dinge, die ich versucht habe und scheint mir fehlt heraus etwas:

  • TouchUtils.longClickView (InstrumentationTestCase Test, Blick v) funktioniert gut ... für longClickView zu schaffen .. Auch ich konnte longClickView() an bestimmten Bildschirm-Speicherort durch Einführung der Zeitverzögerung zwischen ACTION_DOWN und ACTION_UP-Ereignis .. siehe Anhang
  • Ich war in der Lage zu erreichen das Benutzer klick Ereignis an bestimmten Bildschirm-Speicherort, aber ich konfrontiert ein seltsames Thema .. Wenn ich die Motio versetze nEvent (100,100) aus dem Testfall .. Das Framework würde immer "-76" in das Y-Ereignis einfügen .. nicht sicher, warum es diese Abweichung gab ... Ich arbeitete um das Problem herum, indem ich 76 zu meinen Eingabedaten hinzufügte (100.176) für die Zeit zu sein .. hatte jemand ein ähnliches Problem?
  • Sogar scheint mit diesem Ansatz Timing ist sehr kritisch .. als Wenn ich mehr Verzögerung zwischen ACTION_DOWN und ACTION_UP platzieren, wird das Ereignis als longClickPress erkannt ... und wenn ich ein wenig weniger ... den "zweiten" einzigen Klick Veranstaltungen (ACTION_DOWN + ACTION_UP) werden als DoubleTapEvent erkannt ..

Was die richtige Timing Kombination für ACTION_UP und ACTION_DOWN .. für eine einzelne Benutzer klicken Ereignissimulation sein sollte .. ????????

@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); 
} 
+0

Wie führen Sie das Doppeltipp-Ereignis durch? – Blackbelt

Antwort

0

Teil Antwort:

noch zu finden, was die 76px Abweichung verursacht, wenn der Benutzer Click-Ereignisse zu schaffen.

Ich war in der Lage, das Single-User-Klick-Ereignis mit 50ms Unterschied pro Propley zu simulieren. Und ich musste 2 Klicks von mindestens 300ms Abstand halten; so dass „SingleTapConfirmed“ allein für die GeastureDetector Klasse ..

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); 
} 
0

statt mit TouchUtils abfeuern kann, habe ich.

Die Benutzeroberfläche wird nicht am Gerät/Gerät aktualisiert, aber die Variable wird im Gerät aktualisiert. In meinem Fall aktualisiert die Schaltfläche den Adapter eines Fragments. Wenn ich nur verwende, TouchUtils.clickView (diese, Schaltfläche) die Benutzeroberfläche auf Gerät wird aktualisiert, aber die Variable nicht aktualisiert.

Also kombiniere ich auch mit TouchUtils. Ich weiß nicht warum, aber es funktioniert.

Verwandte Themen