当前位置: 代码迷 >> 综合 >> CheckBox Navigation(十二)Checkbox nested test plans tutorial
  详细解决方案

CheckBox Navigation(十二)Checkbox nested test plans tutorial

热度:32   发布时间:2023-11-17 14:49:56.0

Checkbox

CheckBox Navigation 1

      • Checkbox nested test plans tutorial
        • 1. Quick start
        • 2. Use cases
          • 1)How to use a base test plan?
          • 2) How to use a base test plan, but without running them last?
          • 3) How to change category or certification status of jobs coming from nested parts?
          • 4) How to include a nested part from another namespace?
          • 5) Is it possible to have multiple levels of nesting?
          • 6) How to use a base test plan except a few jobs?
        • 3. Known limitations

Checkbox nested test plans tutorial

我们设计Checkbox来使用测试提供程序。
因此,测试工具和测试是完全分开的。
Checkbox可以从多个提供程序加载测试。
它们可以作为Debian包安装,也可以从源代码加载以构建快照。

要加载测试并运行它们,我们需要一个测试计划。
Checkbox的测试计划是要逐一运行的作业(测试)id的集合。

大多数时候,当我们创建一个新的测试计划时,需要包括一个通用的部分,这是其他几个测试计划的共同部分。
但是测试计划单元不允许这样的特性,我们最终在我们的项目中产生了许多重复。
而复制意味着重复的工作,以保持所有这些测试计划部分的同步和最新。

如果现在可以嵌套测试计划呢?
一个是由一个或多个“基本测试计划”的部分聚合而来的?

让我们详细回顾一下checkbox从0.29开始提供的新特性

1. Quick start

唯一要添加到您的测试计划的是您想要包含的测试计划的标识符,如下所示:

nested_part:com.canonical.certification::my_base_test_plan

然后,测试计划的顺序将是测试计划include +所有嵌套的测试计划include,按照这个顺序。

加载嵌套部分将加载includemandatory_includebootstrap_include部分以及所有覆盖(类别、认证状态)。

注意:所有强制包含将总是首先运行。

注意:如果作业定义与定义测试计划的提供者位于同一个名称空间中,则可以以缩写形式(不带名称空间前缀)列出作业和测试计划id。

2. Use cases

这里提供了以下所有示例:
https://github.com/yphus/nested_testplan_demo要在本地测试它们,你只需要开发这3个提供商并运行其中一个演示启动程序:

git clone https://github.com/yphus/nested_testplan_demo.git
cd nested_testplan_demo/
find . -name manage.py -exec {
    } develop \;
./demo1 # or demo2, 3, 4, 5, 6.
  • 1)How to use a base test plan?

    让我们使用两个提供程序,它们都属于同一个命名空间 com.ubuntu: com ubuntu: foocom.ubuntu:baz

    Baz provider包含以下单元、4个作业和一个测试计划(我们的基本测试计划):

    id: hello
    command: echo hello
    flags: simpleid: bye
    command: echo bye
    flags: simpleid: mandatory
    command: true
    flags: simpleid: bootstrap
    command: echo os: ubuntu
    plugin: resource
    flags: simpleunit: test plan
    id: baz_tp
    _name: Generic baz test plan
    _description: This test plan contains generic test cases
    estimated_duration: 1m
    include:hello       certification-status=blockerbye         certification-status=non-blocker
    mandatory_include:mandatory   certification-status=blocker
    bootstrap_include:bootstrap
    

    Foo provider包含两个新测试:

    id: always-pass
    command: true
    flags: simpleid: always-fail
    command: true
    flags: simple
    

    我们希望在新的测试计划(在Foo提供程序中)中重用baz_tp和两个新的测试。这样的测试计划如下:

    unit: test plan
    id: foo_tp_1
    _name: Foo test plan 1
    _description: This test plan contains generic tests + 2 new tests
    include:always-pass       certification-status=blockeralways-fail
    nested_part:baz_tp
    

    jobs的执行顺序是:
    - bootstrap
    - mandatory
    - always-pass
    - always-fail
    - hello
    - bye

  • 2) How to use a base test plan, but without running them last?

    让我们保留前面的提供程序Foo和Baz。这一次,我们希望在always-pass和始 always-fail之间运行基本测试计划。为了更改作业的执行顺序,新的测试计划将由几个嵌套的部分组成,因为它们将遵循列表的顺序。让我们在Foo provider中创建两个新的测试计划,我们将使用它们作为嵌套部分来微调作业顺序:

    unit: test plan
    id: foo_tp_part1
    _name: Foo test plan part 1
    _description: This test plan contains part 1
    estimated_duration: 1m
    include:always-pass       certification-status=blockerunit: test plan
    id: foo_tp_part2
    _name: Foo test plan part 2
    _description: This test plan contains part 2
    estimated_duration: 1m
    include:always-fail
    

    最终的测试计划将只包含嵌套的部分:

    unit: test plan
    id: foo_tp_2
    _name: Foo test plan 2
    _description:This test plan contains generic tests + 2 new tests (but ordered differently)
    include:
    nested_part:foo_tp_part1baz_tpfoo_tp_part2
    

    注意:总是保持include部分(即使是空的),因为这个字段是必须的,否则验证将失败(并且测试计划永远不会通过Checkbox加载)

    jobs的执行顺序是:
    - bootstrap
    - mandatory
    - always-pass
    - hello
    - bye
    - always-fail

  • 3) How to change category or certification status of jobs coming from nested parts?

    测试计划覆盖机制仍然适用于嵌套部分。
    例如,来自Baz提供程序的hello作业被定义为拦截器,并且没有类别。

    让我们更新之前的用例:

    unit: test plan
    id: foo_tp_3
    _name: Foo test plan 3
    _description: This test plan contains generic tests + 2 new tests + overrides
    include:always-pass       certification-status=blockeralways-fail
    nested_part:baz_tp
    certification_status_overrides:apply non-blocker to hello
    category_overrides:apply com.canonical.plainbox::audio to hello
    

    要检查重写是否如预期的那样工作,您可以打开json导出器报告:

    "result_map": {
          "com.ubuntu::hello": {
          "summary": "hello","category_id": "com.canonical.plainbox::audio","certification_status": "non-blocker"
    [...]
    
  • 4) How to include a nested part from another namespace?

    您可以从另一个名称空间中包含嵌套的部分,只需在测试计划标识符前面加上提供者名称空间。

    让我们使用第三个提供程序(Bar,在com.ubuntu命名空间)作为一个例子:

    id: sleep
    command: sleep 1
    flags: simpleid: uname
    command: uname -a
    flags: simpleunit: test plan
    id: bar_tp
    _name: bar test plan
    _description: This test plan contains bar test cases
    estimated_duration: 1m
    include:sleepuname
    

    现在在provider Foo中,一个测试计划包含了provider Bar中的一个部分,看起来像这样:

    unit: test plan
    id: foo_tp_4
    _name: Foo test plan 4
    _description:This test plan contains generic tests + 2 new tests + 2 tests from adifferent namespace provider
    include:always-pass       certification-status=blockeralways-fail
    nested_part:baz_tpcom.ubuntu::bar_tp
    

    jobs的执行顺序是:
    - bootstrap
    - mandatory
    - always-pass
    - always-fail
    - hello
    - bye
    - sleep
    - uname

  • 5) Is it possible to have multiple levels of nesting?

    是的,可以有多个层次的嵌套,一个嵌套部分是由另一个嵌套部分构建的,每个层次带来它自己的一组新测试。

    让我们向供应商Baz添加一个新的测试计划:

    unit: test plan
    id: baz_tp_2
    _name: Generic baz test plan 2
    _description: This test plan contains generic test cases + a nested part
    include:hello       certification-status=blockerbye         certification-status=non-blocker
    mandatory_include:mandatory   certification-status=blocker
    bootstrap_include:bootstrap
    nested_part:com.ubuntu::bar_tp
    

    正如您所看到的,这个测试计划包含了提供者栏中的一部分(与前面的例子中使用的相同)。
    在提供程序Foo中,我们可以创建一个新的测试计划,包括baz_tp_2:

    unit: test plan
    id: foo_tp_5
    _name: Foo test plan 5
    _description: This test plan is built from multiple level of nested test plans
    include:always-pass       certification-status=blockeralways-fail
    nested_part:baz_tp_2
    

    jobs的执行顺序仍然是:
    - bootstrap
    - mandatory
    - always-pass
    - always-fail
    - hello
    - bye
    - sleep
    - uname

  • 6) How to use a base test plan except a few jobs?

    测试计划单元支持一个可选字段 - exclude - 我们可以使用该字段从嵌套的include 包含部分中删除作业。

    注意:exclude id不能删除属于mandatory_include部分的作业(嵌套或非嵌套)。
    下面的测试计划(来自provider Foo)不会运行provider Baz的hello任务:

    unit: test plan
    id: foo_tp_6
    _name: Foo test plan 6
    _description: This test plan contains generic tests + 2 new tests - hello job
    include:always-pass       certification-status=blockeralways-fail
    exclude:hello
    nested_part:baz_tp
    

    jobs的执行顺序是:
    - bootstrap
    - mandatory
    - always-pass
    - always-fail
    - hello
    - bye

3. Known limitations

如果嵌套部分正在调用自己,或者嵌套链中的某个地方存在这样的循环,则可以创建无限循环。
Checkbox不会喜欢这样,目前还没有验证来防止它,请注意!

  相关解决方案