使用 Test::Base 构建你的测试框架

Test::Base 简介

Test::Base 是一个数据驱动测试框架,能让你更加容易地编写你自己的测试框架。在学习 Test::Base 之前,你需要具有一点点的 Perl 语言基础。关于 Test::Base 的官方说明请移动到 Test::Base 官方文档。

依赖安装

首先你需要安装 perl,关于 perl 的安装这里不再详细展开,一般的 linux 系统都默认有安装,现在我们来安装一下 cpanm,这是一个能够从 CPAN 中获取、解包编译和安装模块,在安装我们需要的模块 Test::Base

$apt-get install cpanminus
$cpanm Test::Base

创建目录和文件

为了介绍一下如何使用 Test::Base,现在假设我们写一个测试框架来简单测试 code 段和 verify 段的代码是否一致,学会了这个基本的结构,你就能编写很多很复杂的测试用例,目录结构如下所示:

|——lib
|  |——Test
|     |——Style
|        |——BaseLib.pm
|        |——Util.pm
|——t
   |——main.t

编辑 mian.t 文件:

use lib 'lib';                       # 添加我们的库路劲 lib,上面的 lib 文件夹
use Test::Style::BaseLib 'no_plan';  # 选择 no_plan 表示没有测试计划

run_test();                          # 执行程序自定义的入口函数

__DATA__

=== TEST 1: test1

--- code
local x = 1   --set x = 1
--- verify
local x = 1   -- set x = 1

=== TEST 2: test2

--- code
local x=1   -- set x = 1
--- verify
local x = 1   -- set x = 1

先讲解一下上面的程序,__DATA__perl 代码中放置文本的地方。
文本区域是由 block 组成的。例如下面就是一个 block:

=== TEST 1: test1

--- code
local x = 1   --set x = 1
--- verify
local x = 1   -- set x = 1

编辑 BaseLib.pm 文件:

package Test::Style::BaseLib;

# 注意!若要使用下面的模块需要用类似 cpanm Test::Base 这种方式来安装。
use Test::Base -Base;
use File::Temp qw( tempfile );     # 创建临时文件的模块
use IPC::Run ();                   # 此模块可以很好地执行我们的 shell 指令
use Data::Dumper;

# 导出本文件内的 run_test 函数,若没有此行代码 main.t 将无法使用该函数。
our @EXPORT = qw(
    run_test
);

sub run_test(){
    for my $block (Test::Base::blocks()) {
        run_block($block);
    } 
}

sub run_block($) {

    my $block = shift;
    
    my $name = $block->name;
    
    my $code= $block->code; 
    
    my $verify= $block->verify;

    is $verify, $code, "$name - stdout eq okay";  # 判断 is 函数的第一个和第二个参数是否一致
}

1;

__END__

NONE

运行测试程序

在与 libt 同一级目录下执行:

prove -v t/main.t

或者

prove -v t/*

表示 t 目录下所有文件,若运行成功,则会列出来,若失败,也会有提示。

总结

看完上面的简单教程后也许你会觉得很简单,用 python 也可以很容易地实现呀!其实认真研究一下你会知道,这样的测试程序是很 直观高效 的。在上面的基础上,你可以完成很多很复杂的测试。如果你想了解更多这方面的信息,你可以看看春哥基于 Test::Base 写的测试框架 Test::Nginx,读春哥的代码是一个非常好的学习方法。

若在使用 Test::Base 构建自己的测试框架的过程中遇到问题,欢迎交流!

你可能感兴趣的:(perl)