android - TouchUtils 和 ActivityInstrumentationTestCase2 用户事件单元测试用例不工作

标签 android testing junit android-ndk touch

目前我在单元测试框架方面遇到了一些困难...

我想做什么

  • 我需要模拟屏幕上的 2 次点击 (100,100) 和 (400,400),持续时间差异很小。
  • 我需要在屏幕上模拟一个 longPressClick 假设 ( 200, 200 )
  • 当用户点击时, native 代码运行并对位图执行像素操作。
  • 本次测试将针对多组点进行运行,用于分析系统的运行时性能

这是我卡住的地方

  • 我正在为用户点击事件使用 activityInstrumentationTestCase2 和 touchUtils。
  • TouchUtils.longClickView(InstrumentationTestCase test, View v) 工作正常;我能够准确地检测到长按事件,但是测试用例甚至在我的 UI 线程中的计算/渲染完成之前就完成了;在这种情况下如何阻止测试退出?
  • 如何在屏幕上的特定位置模拟 2/3 次用户点击?因为 TouchUtils.clickView(InstrumentationTestCase test, View v) 只会模拟用户在屏幕中央点击...如何正确执行?

这些是我尝试过的东西,但似乎我遗漏了一些东西:

  • TouchUtils.longClickView(InstrumentationTestCase test, View v) 工作正常...用于创建 longClickView .. 即使我能够通过引入 ACTION_DOWN 和 ACTION_UP 事件之间的时间延迟在特定屏幕位置创建 longClickView() .. 请引用附上代码
  • 我能够在特定屏幕位置实现用户点击事件,但我遇到了一个奇怪的问题。当我从测试用例中删除 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);
}

最佳答案

部分答案:

仍在创建用户点击事件时找出导致 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);
}

关于android - TouchUtils 和 ActivityInstrumentationTestCase2 用户事件单元测试用例不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9951480/

相关文章:

java - Spring boot - 单元测试 Spring Data JPA 存储库

java - 单元测试覆盖率和测试大型组件

android - 使用 FragmentStatePagerAdapater "The specified child already has a parent"错误

Haskell:如何测试使用 wreq 的 Spock 应用程序?

testing - 如何在进行性能测试时在 jmeter 上启用 JS

java - Gradle 测试任务不运行带有@Category 和@RunWith 注释的JUnit 测试

java - 使用 gson 将 JSON 转换为 java 对象

android - 在 react native 的 websocket uri 中传递参数不起作用

android - 在 Activity 启动时显示 AlertDialog,但不在屏幕方向更改时显示?

unit-testing - t.Cleanup有什么用?