Skip to content

While 控制器与代码中的 While 控制结构相同,当条件满足时就会一直循环执行子元件。对应的类为 WhileController。

条件表达式

当条件满足(返回值可转为字符串 true)时就会循环执行子元件。

yaml
name: While 控制器示例
variables:
  cnt: 10
steps:
  - name: 条件表达式
    while:
      condition: ${cnt > 0}
    steps:
      - name: 循环内容
        noop: 1
        teardownHooks:
          - ${vars.put("cnt", cnt - 1)}
name: While 控制器示例
variables:
  cnt: 10
steps:
  - name: 条件表达式
    while:
      condition: ${cnt > 0}
    steps:
      - name: 循环内容
        noop: 1
        teardownHooks:
          - ${vars.put("cnt", cnt - 1)}
java
// 这里对变量的使用还是比较繁琐,后续考虑 condition 支持 lambda 表达式,配合 Ref 类进行简化,下面是一个初步设想:
// 如果是 Groovy 用例,可以进一步简化,因为 Groovy 默认会将变量包装为引用类型
// Ref<Integer> total = ref(10);    // 替换 sv("total", 10);
// onWhile("条件表达式", () -> total.value > 0, () -> {
//     total.value--;               // 替换 sv("total", (Integer) sv("total") - 1);
// })
sv("total", 10);
onWhile("条件表达式", "${total > 0}", () -> {
    sv("total", (Integer) sv("total") - 1);
});
// 这里对变量的使用还是比较繁琐,后续考虑 condition 支持 lambda 表达式,配合 Ref 类进行简化,下面是一个初步设想:
// 如果是 Groovy 用例,可以进一步简化,因为 Groovy 默认会将变量包装为引用类型
// Ref<Integer> total = ref(10);    // 替换 sv("total", 10);
// onWhile("条件表达式", () -> total.value > 0, () -> {
//     total.value--;               // 替换 sv("total", (Integer) sv("total") - 1);
// })
sv("total", 10);
onWhile("条件表达式", "${total > 0}", () -> {
    sv("total", (Integer) sv("total") - 1);
});
groovy
sv("total", 10)
onWhile("条件表达式", '${total > 0}') {
    sv("total", (Integer) sv("total") - 1)
}
sv("total", 10)
onWhile("条件表达式", '${total > 0}') {
    sv("total", (Integer) sv("total") - 1)
}

超次限制

While 循环控制器和其他循环控制器相比存在一定的使用风险,如果使用不当可能导致死循环,为此 While 循环控制器引入了循环限制支持。

超次限制:循环超过指定次数则结束循环。

yaml
name: While 控制器示例
variables:
  cnt: 10
steps:
  - name: 超次限制
    while:
      condition: ${cnt > 0}
      limit: 5
    steps:
      - name: 循环内容
        noop: 1
        teardownHooks:
          - ${sleep(10)}
          - ${vars.put("cnt", cnt + 1)}
name: While 控制器示例
variables:
  cnt: 10
steps:
  - name: 超次限制
    while:
      condition: ${cnt > 0}
      limit: 5
    steps:
      - name: 循环内容
        noop: 1
        teardownHooks:
          - ${sleep(10)}
          - ${vars.put("cnt", cnt + 1)}
java
sv("cnt", 10);
onWhile("超次限制", it -> it.condition("${cnt > 0}").limit(5), () -> {
    sleep(10);
    sv("cnt", (Integer) sv("cnt") + 1);
});
sv("cnt", 10);
onWhile("超次限制", it -> it.condition("${cnt > 0}").limit(5), () -> {
    sleep(10);
    sv("cnt", (Integer) sv("cnt") + 1);
});
groovy
sv("cnt", 10)
onWhile("超次限制", { condition '${cnt > 0}' limit 5 }) {
    sleep(10)
    sv("cnt", (Integer) sv("cnt") + 1)
}
sv("cnt", 10)
onWhile("超次限制", { condition '${cnt > 0}' limit 5 }) {
    sleep(10)
    sv("cnt", (Integer) sv("cnt") + 1)
}

超时限制

超时限制:循环超过指定时长(ms)则结束循环。

yaml
name: While 控制器示例
variables:
  total: 10
steps:
  - name: 超时限制
    while:
      condition: ${total > 0}
      # 大于 timeout 才会终止,0 ms 可能执行多次,即 endTime - startTime > 0
      # 当值为 -1 时表示最多执行一次,因为执行一次后肯定大于 -1ms
      timeout: 50  # 单位 ms
    steps:
      - name: 循环内容
        noop: 1
        teardownHooks:
          - ${sleep(10)}
          - ${vars.put("total", total + 1)}
name: While 控制器示例
variables:
  total: 10
steps:
  - name: 超时限制
    while:
      condition: ${total > 0}
      # 大于 timeout 才会终止,0 ms 可能执行多次,即 endTime - startTime > 0
      # 当值为 -1 时表示最多执行一次,因为执行一次后肯定大于 -1ms
      timeout: 50  # 单位 ms
    steps:
      - name: 循环内容
        noop: 1
        teardownHooks:
          - ${sleep(10)}
          - ${vars.put("total", total + 1)}
java
sv("total", 10);
onWhile("超时限制", it -> it.condition("${total > 0}").timeout(50), () -> {
    sleep(10);
    sv("total", (Integer) sv("total") + 1);
});
sv("total", 10);
onWhile("超时限制", it -> it.condition("${total > 0}").timeout(50), () -> {
    sleep(10);
    sv("total", (Integer) sv("total") + 1);
});
groovy
sv("total", 10)
onWhile("超时限制", { condition '${total > 0}' timeout(50) }) {
    sleep(10)
    sv("total", (Integer) sv("total") + 1)
}
sv("total", 10)
onWhile("超时限制", { condition '${total > 0}' timeout(50) }) {
    sleep(10)
    sv("total", (Integer) sv("total") + 1)
}