什么是测试Web应用程序的perlish方法,特别是在并发访问方面?

时间:2011-04-05 08:56:30

标签: perl unit-testing web-applications concurrency cgi

我正在开发一个使用CGI.pm实现用户交互的Web应用程序。现在我喜欢通过实施单元测试来测试我的更改。这些是我的要求:

  1. Perlish 方式
  2. 省力实施单元测试验证简单工作流程。 我的Web应用程序主要包含两种显示和更改的表单 平面文件数据库的内容。
  3. 允许测试多个用户的并发访问权限。 这应该确保例如锁定以正确的方式执行。 我对性能测量不感兴趣。
  4. 与Ecplise集成( EPIC
  5. 可读和口语单元测试
  6. 到目前为止,我找到了这些软件包:CGI::TestTest::HTTPHTTP::WebTestTest::WWW::Mechanize

    • CGI ::测试作为一个项目接缝已经死了,最后一次改变是在2003年10月。
    • 测试:: HTTP 侧重于HTTP连接。
    • HTTP :: WebTest 正在运行测试规范中的测试。更多包,但最后一次更改是在2003年9月。
    • 测试:: WWW :: Mechanize 全面而现代的界面。由多人维持一段时间。可读测试,但接缝专注于测试静态页面(可能这不正确,但仅基于方法的数量)。使用submit_form_ok可以填写表单,但没有示例表明可以检查返回的页面。测试并发访问对我来说也不是很明显。

    所以我的研究将导致Test :: WWW :: Mechanize。这是正确的方法吗?

    提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

测试:: WWW :: Mechanize是一个很好的方法。

Test :: WWW :: Mechanize是WWW::Mechanize的子类,Test::WWW::Mechanize->new返回一个LWP::UserAgent子类的对象。因此,如果您阅读并理解这些库的文档,它将对您有所帮助。例如,WWW :: Mechanize文档将向您解释如何提交表单并检索其内容。

实施例

以下是测试2位用户同时访问的示例,并说明了如何检查结果(改编自Catalyst testing tutorial):

my $ua1 = Test::WWW::Mechanize->new;  # user agent 1, Bud
my $ua2 = Test::WWW::Mechanize->new;  # user agent 2, Ace

# Log in as each user
$ua1->get_ok("http://localhost/login?username=Bud&password=xxx", "Login 'Bud'");
$ua2->get_ok("http://localhost/login?username=Ace&password=xxx", "Login 'Ace'");

# Go back to the login page and it should show that we are already logged in
$_->get_ok("http://localhost/login", "Return to '/login'") for $ua1, $ua2;
$_->title_is("Login", "Check for login page") for $ua1, $ua2;
$_->content_contains("Please Note: You are already logged in as ",
    "Check we ARE logged in" ) for $ua1, $ua2;

简要说明:

get_ok($ url,$ msg):

检查以确保可以检索$ url。测试失败时显示$ msg。

title_is($ title,$ msg):

检查< title> ...< / title>的内容标签。测试失败时显示$ msg。

content_contains($ content,$ msg):

检查正则表达式$ content是否与html正文中的任何内容匹配。测试失败时显示$ msg。

需要考虑的更多事情

您可能需要查看Test::WWW::Mechanize::CGI。它允许您在不运行Web服务器的情况下进行测试。

如果您正在寻找示例,WWW::Mechanize::FAQ对您有用。

答案 1 :(得分:3)

我建议将测试分为两部分:

  1. 使用Test :: WWW :: Mechanize测试界面。 Test :: WWW :: Mechanize适用于静态和动态页面,但它的目的是动态页面。在submit_form_ok之后,您需要使用content_contains,content_like和“CONTENT CHECKING”组的其他方法。另外,Test :: WWW :: Mechanize是一个WWW :: Mechanize子类,因此您可以使用任何WWW :: Mechanize方法,如“content”。
  2. 测试并行访问。将程序的该部分拆分为单独的库,并使用Test :: More和fork对其进行测试。