很多情况下我们等待某种条件成立时,才可以进行一下操作。我们可以定义一个 Condition 类,在 Helper Superclass 中添加一个 waitForCondition 方法来方便脚本开发。如代码清单 4 所示。

  清单 4.

public interface Condition {
 boolean value();
}

/**
 * 判断条件在指定时间内是否成立
 * @param condition
 * @param timeout
 * @param interval
 * @return
 */
public static boolean isTrue(Condition condition, double timeout, double interval){
 long startTime = System.currentTimeMillis();
 while (System.currentTimeMillis() - startTime < timeout * 1000) {
  if (condition.value())
   return true;
  sleep(interval);
 }
 return condition.value();
}

/**
 * 等待条件成立。如果在指定时间内没有成立,将抛出异常
 * @param condition
 * @param timeout
 * @param interval
 */
public static void waitForCondition(Condition condition, double timeout, double interval){
 if (!isTrue(condition, timeout, interval))
  throw new RuntimeException("Condition is not true!");
}

  修改脚本执行中有关时间的选项来增加稳定性

  RFT 在识别测试对象,模拟鼠标,键盘事件过程中,都使用了一些默认值。这些值能保证测试脚本在一台性能不错的测试机上成功执行,但遇到一台很慢的测试机,往往会失败。可以通过 API 来修改这些与时间相关的选项,适当的增加延迟让脚本更加健壮。这些选项的常量定义在 com.rational.test.ft.script.IOptionName 中。RationalTestScript.setOption()/resetOption() 可以改变这些选项,也可以通过 getOption() 来获得选项的值。例如被测程序不能处理过快的用户输入,可以如代码清单 5 所示改变输入文字的速度。表 1 中是 RFT 支持的有关时间的所有选项。

  清单 5.

setOption(IOptionName.DELAY_BEFORE_KEY_DOWN, 1); // 等待 1 秒后,再按下按键
InputWindow().inputKeys("slow down");
resetOption(IOptionName.DELAY_BEFORE_KEY_DOWN); // 恢复默认值

  表 1. 有关时间的选项