ZStack的系统测试系统在真实的硬件环境中运行测试用例;像集成测试一样,这个系统测试也是全自动的,而且覆盖的层面包括:功能性测试、压力测试、性能测试。
概述
虽然集成测试系统,如我们在ZStack—自动化测试系统1:集成测试中所介绍的,强大到可以暴露开发过程中大多数的缺陷,也是有着固有的弱点的。首先,由于测试用例使用模拟器,它们不能测试真实场景,比如在一个物理的KVM主机上创建一个VM。第二,集成测试用例主要关注一个简单的场景,在一个简单的人造的环境中;举个例子,还是创建VM的这个用例,它可能只部署一个最小的环境,包括一个主机和一个L3网络,仅仅用于满足创建一个VM的需求。这些弱点,然而也是深思熟虑过的,因为我们想要开发人员能够在他们开发新特性时快速和容易地写测试用例,这是一个我们必须采取的权衡。
系统测试,目标在于测试整个软件,在一个真实的、复杂的环境中,很自然地补充集成测试。ZStack的系统测试系统被设计用于以下两个目标:
- 复杂的场景:这些场景应该比真实世界的使用场景更复杂,以测试软件的极限。举个例子,挂载和卸载磁盘的测试用例应该持续地、重复地对虚拟机执行,以一种非常快,人类无法手动做到的方式。
- 易于编写和维护测试用例:就像集成测试系统,系统测试系统接管了大多数无聊重复的任务,让测试人员有效率地写测试用例。
这个系统测试系统是一个Python项目,命名为zstack-woodpecker,由以下三个部分组成:
- 测试框架:一个测试框架,管理所有的测试用例,以及提供必须的库和工具。
- 环境部署工具:一个工具,用于从XML配置文件部署一个环境;它非常类似于集成测试系统的部署器。
- 模块化测试用例:测试用例是高度模块化的,而且覆盖了:功能测试、性能测试和压力测试。
系统测试
zstack-woodpecker完全由我们自己创建;在决定重新造这个轮子之前,我们试过了流行的Python测试框架,像nose,然后最终选择了创造一个新的工具,用以最大化地满足我们的目标。
套件配置
类似所有的其他测试框架,一个zstack-woodpecker中的测试套件是以suite setup开始,以suite teardown结束,在其中有一些测试用例。这里的suite setup和suite teardown是两个特殊的测试用例,suite setup负责准备后续的测试用例所需的环境,suite teardown负责在所有测试用例结束之后清理这个环境。一个典型的测试套件配置文件看起来像:
<integrationTest>
<suite name="basic test" setupCase="suite_setup.py" teardownCase="suite_teardown.py" parallel="8">
<case timeout="120" repeat="10">test_create_vm.py</case>
<case timeout="220">test_reboot_vm.py</case>
<case timeout="200">test_add_volume.py</case>
<case timeout="200">test_add_volume_reboot_vm.py</case>
<case timeout="400">test_add_multi_volumes.py</case>
<case timeout='600' repeat='2' noparallel='True'>resource/test_delete_l2.py</case>
</suite>
</integrationTest>
敏锐的读者可能会注意到一些参数是在其他的测试框架中看不到的。
第一个是timeout;每一个测试用例可以定义自己的超时时间,如果在这段时间内不能完成,它将被在最终的结果里被标记成超时。
第二个是repeat,允许你在测试套件中指定这个用例应该被执行多少次。
第三个,也是杀手级的参数是parallel,允许测试人员设定这个套件的并行级别;这是一个使得zstack-woodpecker运行测试用例非常快的关键特性;在上面这个例子中,parallel被设