【问题标题】:Test between key down and key up event在 key down 和 key up 事件之间进行测试
【发布时间】:2011-08-09 01:02:38
【问题描述】:

是否有可能在应用程序的按键按下和按键按下事件处理程序之间运行测试?我开发2D街机游戏,gameView里面的gameThread处理按键。我写了 JUnit Android 测试项目。 我已经阅读过 this.sendKeys() 的内容,但似乎该方法先向上发送键,然后向下发送信号。

详情: 我将同时使用 - 触摸和非触摸交互。但现在我正在测试

非触摸。于是我写了:

`protected void setUp() throws Exception {

    super.setUp();
    setActivityInitialTouchMode(false);
    _activity = (GameTemplate) getActivity();
    <...>

}`

作为测试初始化​​。

我编写了测试以确保 keyUp 事件处理良好:

`public void testReturnState() {

    this.sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
    _instrumentation.waitForIdleSync();
assertTrue(_logic.getSerp().state().equals(SerpentState.SERP_MOVES_FORWARD));

}`

它工作正常,但我写了另一个测试:

`public void testKeysSimple() {

    this.sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
    assertTrue(_logic.getSerp().state().equals(SerpentState.SERP_MOVES_LEFT));

}`

它失败了,我认为它的发生是因为以下两个原因之一:

1) 程序尚未处理 keyDown 事件;

2) 程序同时处理了 keyDown 和 keyUp 事件

我是测试新手,也许用另一种方式可以更轻松地完成所有工作。请帮帮我。

我尝试在测试中添加重复:

public void testKeysUpDown() {  
    int t = TSet.skips;
    this.sendRepeatedKeys(TSet.keyRepeats,KeyEvent.KEYCODE_DPAD_LEFT);
    while(t>0 && !_logic.getSerp().state().equals(SerpentState.SERP_MOVES_LEFT)) t--;
    assertTrue(t>0);
}

但它也失败了。

【问题讨论】:

    标签: android junit key-events


    【解决方案1】:

    您需要Instrumentation#sendKeySync 才能完全控制发送的事件。

    【讨论】:

      【解决方案2】:

      如果您使用的是基于触摸的交互,那么您可以使用 MotionEvent.ACTION_MOVE。这是用户在没有抬起手指的情况下触摸屏幕并拖动的时候。

      代码片段

      public boolean onTouch(View v, MotionEvent rawEvent) {
      
          switch (rawEvent.getAction() & MotionEvent.ACTION_MASK)
          {
              case MotionEvent.ACTION_DOWN:
              // First touch on the screen
              break;
      
              case MotionEvent.ACTION_POINTER_DOWN:
              // Multi-touch on the screen
              break;
      
              case MotionEvent.ACTION_UP:
              // Lift from the screen
              break;
      
              case MotionEvent.ACTION_POINTER_UP:
              // Multi-Lift from the screen
              break;
      
              case MotionEvent.ACTION_MOVE:
              // Drag on the screen
              break;
          }
      
      }
      

      沙士

      【讨论】:

      • 我现在正在为非触摸事件编写测试。我已经为我的问题带来了细节。见上文,这是我在这里的第一个问题,很抱歉,如果有问题。
      • 我有两个项目:Game 和 GameTest,先做第二个测试。您的代码是一种方法,不能在测试端运行。不过,也许我不知道一些测试机制。如果有,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2017-07-14
      相关资源
      最近更新 更多