代码之家  ›  专栏  ›  技术社区  ›  Eric Strom

当一个特性被添加到Perl中时,我如何进行测试?

  •  26
  • Eric Strom  · 技术社区  · 15 年前

    codepad 这将允许您在旧版本的Perl上测试Perl构造?

    理想情况下,您可以在一个系统中输入一个表达式,它将告诉您它将使用的最旧版本的perl。

    当然可以使用CPANTS来实现这一点,但这似乎是对服务的滥用(如果只是为了使BackPan更大的话)。而且可能需要几天/几周的时间才能在旧版本上获得良好的测试覆盖率。

    4 回复  |  直到 15 年前
        1
  •  23
  •   daotoad    15 年前

    你可能会发现 Perl::MinimumVersion perlver 实用程序来扫描你的代码。

        2
  •  9
  •   Jonathan Leffler    15 年前

    我想如果我担心的话,我会在我的机器上构建Perl的重要版本并进行测试。事实上,不管怎样,我或多或少都是这么做的。我的Solaris 10计算机具有:

    lrwxrwxrwx   1 jleffler rd            26 Mar  6  2008 v5.10.0 -> v5.10.0-32bit-multiplicity
    drwxr-xr-x   3 jleffler rd           512 Jan 10  2008 v5.10.0-32bit
    drwxr-xr-x   6 jleffler rd           512 Mar  7  2008 v5.10.0-32bit-multiplicity
    drwxr-xr-x   3 jleffler rd           512 Jan 10  2008 v5.10.0-64bit
    lrwxrwxrwx   1 jleffler rd            13 Jan 29 21:07 v5.10.1 -> v5.10.1-64bit
    drwxr-xr-x   6 jleffler rd           512 Jan 29 21:43 v5.10.1-64bit
    drwxr-xr-x   5 jleffler rd           512 May  6  2003 v5.5.3
    lrwxrwxrwx   1 jleffler RAND          11 Mar 21  2007 v5.6.1 -> v5.6.1-full
    drwxr-xr-x   5 jleffler rd           512 May  6  2003 v5.6.1-full
    drwxr-xr-x   5 jleffler rd           512 Feb  5  2008 v5.8.7-multi
    lrwxrwxrwx   1 jleffler rd            19 Mar 24  2007 v5.8.8 -> v5.8.8-32bit-sun-cc
    drwxr-xr-x   6 jleffler rd           512 Mar 25  2007 v5.8.8-32bit-sun-cc
    drwxr-xr-x   5 jleffler rd           512 Feb 13  2006 v5.8.8-64bit-thread-multi
    drwxr-xr-x   3 jleffler rd           512 Mar 20  2008 v5.8.8-gcc-3.4.6
    

    因此,安装了5.5.3、5.6.1、5.8.7、5.8.8、5.10.0和5.10.1;我也有其他版本的源代码:

    -rw-r--r--   1 jleffler rd       2171936 Apr 12  2001 perl-5.004_04.tar.bz2
    -rw-r--r--   1 jleffler rd       3023320 Aug 31  1999 perl-5.005_03.tar.bz2
    -rw-r--r--   1 jleffler rd       12426022 Dec 18  2007 perl-5.10.0.tar.bz2
    -rw-r--r--   1 jleffler rd       11608061 Jan 29 12:32 perl-5.10.1.tar.bz2
    -rw-r--r--   1 jleffler rd       4430438 Mar 29  2000 perl-5.6.0.tar.bz2
    -rw-r--r--   1 jleffler rd       4864306 Apr  8  2001 perl-5.6.1.tar.bz2
    -rw-r--r--   1 jleffler rd       5142605 Aug 16  2005 perl-5.6.2.tar.bz2
    -rw-r--r--   1 jleffler rd       8618487 Jul 18  2002 perl-5.8.0.tar.bz2
    -rw-------   1 jleffler rd       9410641 Sep 29  2003 perl-5.8.1.tar.bz2
    -rw-r--r--   1 jleffler rd       9424944 Nov  5  2003 perl-5.8.2.tar.bz2
    -rw-r--r--   1 jleffler rd       9509716 Jan 14  2004 perl-5.8.3.tar.bz2
    -rw-r--r--   1 jleffler rd       9598489 Apr 21  2004 perl-5.8.4.tar.bz2
    -rw-r--r--   1 jleffler rd       9464689 Jul 19  2004 perl-5.8.5.tar.bz2
    -rw-r--r--   1 jleffler rd       9693085 Nov 27  2004 perl-5.8.6.tar.bz2
    -rw-r--r--   1 jleffler rd       9839086 Jun 15  2005 perl-5.8.7.tar.bz2
    -rw-r--r--   1 jleffler rd       10123359 Feb 13  2006 perl-5.8.8.tar.bz2
    -rw-r--r--   1 jleffler rd       11121414 Dec 14  2008 perl-5.8.9.tar.bz2
    

    您是否有一个脚本,可以对所有版本按顺序运行特定的模块、脚本或单元测试,并整理结果?作为chrooted/sandboxed CGI,这样的实用程序可能非常方便。

    没有,但我不需要。不过,这基本上是微不足道的:

    for perl in /usr/perl/v5.*.?
    do
        echo $(basename $perl)
        $perl/bin/perl "$@"
    done
    

    基本上,对于/usr/Perl/中的每个Perl目录,在给定的参数集上从bin目录运行Perl。观看输出。。。

        if $perl/bin/perl "$@" >/dev/null 2>&1
        then echo ok $perl
        else echo not ok $perl
        fi
    

    这和 TAP

    test=0
    max=$(ls -d /usr/perl/v5.*.? | wc -l | sed 's/ //g')
    echo 1..$max
    for perl in /usr/perl/v5.*.?
    do
        ((test = test + 1))
        if $perl/bin/perl "$@" >/dev/null 2>&1
        then echo     ok $test - $perl
        else echo not ok $test - $perl
        fi
    done
    

    下面是一个运行它的示例:

    $ ksh test.perl -e 'exit 0'
    1..6
    ok 1 - /usr/perl/v5.10.0
    ok 2 - /usr/perl/v5.10.1
    ok 3 - /usr/perl/v5.5.3
    ok 4 - /usr/perl/v5.6.1
    ok 5 - /usr/perl/v5.8.8
    not ok 6 - /usr/perl/v5.8.8-gcc-3.4.6
    $
    

    这显示了shell脚本及其globbing工具的局限性(我想将“star”限制为一系列数字)。失败的Perl这样做是因为bin目录不包含Perl的副本;我需要节省一些空间!当然,将shell脚本转换成Perl脚本并不难。

        3
  •  5
  •   Sinan Ünür    15 年前

    如果您想知道模块是何时引入核心Perl的,那么可以使用 Module::CoreList .

    如果你想帮助开发一个像 codepad

    具体地说,如果您希望一个实用程序下载并安装一些Perl二进制文件来测试您的代码,可以查看中的程序 PITA-Setup-Perl/bin .

        4
  •  4
  •   Leon Timmermans    15 年前

    我知道perlcritic能够找到一些案例,但一般来说,你必须在google或perldelta文件中查找。特别是,您可能需要查看 5.6 5.8 5.10 甚至是即将到来的 5.12