充分利用 Avocado 编写 Python 测试用例的实践指南

1. 环境准备
  • 安装 Avocado 框架:

    pip install avocado-framework
    # 安装虚拟化插件(可选)
    pip install avocado-framework-plugin-vt
    
  • 验证安装:

    avocado --version
    avocado plugins
    

2. 测试用例基础结构

(1) 最小化用例模板
from avocado import Test

class MinimalTest(Test):
    def test_hello(self):
        self.log.info("Hello, Avocado!")  # 日志记录
        self.assertTrue(True)             # 断言验证
(2) 运行测试
avocado run minimal_test.py

3. 高效编写用例的技巧

(1) 参数化测试(数据驱动)

使用 avocado.parameters 动态生成多组测试:

from avocado import Test
from avocado import parameter

class ParameterizedTest(Test):
    @parameter.expand([
        ("case1", 1, 2, 3),
        ("case2", 5, 5, 10),
    ])
    def test_addition(self, name, a, b, expected):
        self.assertEqual(a + b, expected)
(2) 预处理与清理

利用 setUp 和 tearDown 管理资源:

from avocado import Test

class VMTest(Test):
    def setUp(self):
        self.vm = self.VMManager.start_vm(image="jeos-27.qcow2")

    def test_vm_boot(self):
        self.assertTrue(self.vm.is_alive())

    def tearDown(self):
        self.vm.destroy()
(3) 使用工具库

调用 avocado.utils 简化操作:

from avocado import Test
from avocado.utils import process, network

class NetworkTest(Test):
    def test_ping(self):
        # 检查网络连通性
        result = network.ping("192.168.1.1", count=3)
        self.assertEqual(result, 0)
    
    def test_disk_size(self):
        # 执行 Shell 命令并验证
        output = process.system_output("df -h /")
        self.assertIn("10G", output)

4. 虚拟化专项用例示例

(1) 虚拟机生命周期测试
from avocado import Test
from avocado.utils import vmimage

class VMLifecycleTest(Test):
    def setUp(self):
        # 下载 JeOS 镜像(自动缓存)
        self.image = vmimage.get("jeos-27", "/var/lib/avocado/images")

    def test_start_stop(self):
        vm = self.VMManager.start_vm(image=self.image)
        self.assertTrue(vm.wait_for_ssh_login(timeout=60))
        vm.destroy()
        self.assertFalse(vm.is_alive())
(2) 设备热插拔测试
from avocado import Test
from avocado.utils import genio

class PCIHotplugTest(Test):
    def test_add_nic(self):
        # 生成设备 XML
        nic_xml = """
        <interface type='network'>
            <source network='default'/>
            <model type='virtio'/>
        </interface>
        """
        genio.write_file("/tmp/nic.xml", nic_xml)
        
        # 热添加网卡
        self.VMManager.attach_device("my_vm", "/tmp/nic.xml", "--live")
        
        # 验证设备存在
        vm_xml = self.VMManager.dumpxml("my_vm")
        self.assertIn("virtio", vm_xml)
(3) 性能基准测试
from avocado import Test
from avocado.utils import cpu, disk

class PerfTest(Test):
    def test_cpu_util(self):
        # 测量 CPU 利用率
        cpu.load_percent(interval=5)  # 模拟负载
        util = cpu.cpu_percent(interval=1)
        self.assertLess(util, 80, "CPU 使用率过高")

    def test_disk_io(self):
        # 测试磁盘 I/O
        speed = disk.disk_io("/dev/sda", test="write", size="1G")
        self.assertGreater(speed, 500)  # 写入速度 >500 MB/s

5. 高级功能

(1) 使用插件扩展功能
  • avocado-vt(虚拟化测试插件):

    from avocado import Test
    from avocado.utils import vt
    
    class KVMTest(Test):
        def test_kvm_module(self):
            self.assertTrue(vt.check_kvm_module())
    
  • 自定义插件:
    参考 Avocado 插件开发文档。

(2) 生成 HTML 报告
avocado run test.py --html report.html
(3) 并行执行测试
avocado run test.py --parallel -j 4  # 4 个进程并行

6. 调试与优化

(1) 日志管理
  • 查看详细日志:
    avocado run test.py --show log
    
  • 日志文件路径:~/avocado/job-results/latest/test.log
(2) 调试失败用例
class DebugTest(Test):
    def test_debug(self):
        self.log.debug("调试信息")
        self.log.error("错误信息")
        # 使用交互式调试器(pdb)
        import pdb; pdb.set_trace()
(3) 性能优化
  • 减少虚拟机启动时间:使用 jeos 镜像或预启动模板。
  • 复用资源:在 setUpClass 中初始化共享资源。

7. 集成到 CI/CD

(1) GitLab CI 示例
# .gitlab-ci.yml
test:
  image: python:3.8
  script:
    - pip install avocado-framework
    - avocado run tests/ --output-check-record all
  artifacts:
    paths:
      - ~/avocado/job-results/latest/
(2) Jenkins Pipeline
pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'avocado run tests/ --html report.html'
            }
        }
        stage('Report') {
            steps {
                publishHTML target: [
                    allowMissing: true,
                    keepAll: true,
                    reportDir: 'avocado/job-results/latest',
                    reportFiles: 'report.html',
                    reportName: 'Avocado Report'
                ]
            }
        }
    }
}

总结

  • 核心原则:
    • 模块化:拆分测试步骤到 setUp/tearDown。
    • 参数化:用 @parameter.expand 减少重复代码。
    • 工具化:充分利用 avocado.utils 库。
  • 虚拟化场景:结合 avocado-vt 和 vmimage 管理虚拟机生命周期。
  • 持续集成:通过 HTML 报告和并行执行提升效率。

通过以上方法,可以高效编写可维护的 Avocado 测试用例,覆盖功能验证、性能测试和复杂虚拟化场景。

更多推荐