扶凯

取势 明道 优术

作者为 扶 凯 发表

这有一些方法来测试你的应用,象模拟一些请求之类的技术,不同的 Web 应用的开发框架,都有一些自己的方法来测试,但不同的框架要使用不同的方法.
Plack::Test 给你统一的接口来测试任何 Web 的应用和框架.PSGI 兼容的 mock request 和 live HTTP server 的二种方法.

使用 Plack::Test

使用 Plack::Test 非常简单,它当然是兼容的 Perl 的标准测试协议 TAP 和 Test::More.

use Plack::Test;
use Test::More;
use HTTP::Request;

my $app = sub {
    return [ 200, [ 'Content-Type', 'text/plain' ], [ "Hello" ] ];
};

test_psgi $app, sub {
    my $cb = shift;

    my $req = HTTP::Request->new(GET => 'http://localhost/');
    my $res = $cb->($req);

    is $res->code, 200;
    is $res->content, "Hello";
};

done_testing;

这个创建或加载时像往常的 PSGI 应用一样,你只要使用 test_psgi 的功能来测试你的使用就行了,这有第二个参数是指使用来测试当前应用的 test client .
你也能使用命名参数,象下面这样

test_psgi app => $app, client => sub { ... }

这个 client 需要一个 callback($cb) ,你可以通过 HTTP::Request 对象取得返回的 HTTP::Response 对象.象正常的 LWP::UserAgent 那样.只要你想,你可以发送尽可能多的 requests.来测试各种属性和响应的详细信息.
存这个代码 .t 文件,运行测试.

 use HTTP::Request::Common

当你使用 HTTP request 时,HTTP::Request::Common 不是必要的,但推荐使用 HTTP::Request::Common .因为它写起来比较明显,可以写更少的代码:

use HTTP::Request::Common;

test_psgi $app, sub {
    my $cb = shift;
    my $res = $cb->(GET "/");
    # ...
};

注意,如果你不写主机地址,默认就是打开 http://localhost/.

Run in a server/mock mode

 默认的 test_psgi 功能回调运行的是模拟 HTTP 请求的方法.把一个 HTTP::Request 那那个 PSGI ENV 的散列对象中,然后运行 PSGI 应用,并返回一个 HTTP::Response 的对象
你可以修改成 live HTTP 的模式.需要设置二个地方
a) 包的变量 $Plack::Test::Impl or
b) 环境变量 PLACK_TEST_IMPL

use Plack::Test;
$Plack::Test::Impl = "Server";
test_psgi ... # the same code

如果你真的想改变,默认的环境变量在 .t 的代码中.

env PLACK_TEST_IMPL=Server prove -l t/test.t

这会运行 PSGI 的应用,使用 Standalone 的后端服务器,然后使用 LWP::UserAgent 来发送 live HTTP request. 你不用修改你的 test 的 client 的代码.callback 的回调会自动的来调整这些名字和端口.

 使用 Plack::Test 测试你的 Web 应用框架
再次重申,对 PSGI 和 Plack 的优点在于我们写的应用使用 PSGI 接口, 可以用于任何 Web 应用程序框架,通过使用 PSGI 你的 web 应用程序框架中一样可以使用 Plack::Test;

use Plack::Test;
use MyCatalystApp;

MyCatalystApp->setup_engine('PSGI');
my $app = sub { MyCatalystApp->run(@_) };

test_psgi $app, sub {
    my $cb = shift;
    # ...
};
done_testing;

 这是我的译文,原文:http://advent.plackperl.org/2009/12/day-13-use-placktest-to-test-your-application.html
 

 

 

来了就留个评论吧! 没有评论