【问题标题】:What is the perlish way to test a web application, especially with regards to concurrent access?测试 Web 应用程序的糟糕方法是什么,尤其是在并发访问方面?
【发布时间】:2011-07-29 19:09:27
【问题描述】:

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

  1. Perlish方式
  2. 省力实施单元测试验证简单的工作流程。 我的 Web 应用程序主要由显示和更改两种形式组成 平面文件数据库的内容。
  3. 允许测试多个用户的并发访问。 这应该确保例如锁定以正确的方式执行。 我对绩效衡量不感兴趣。
  4. 与 Ecplise 集成 (EPIC)
  5. 可读和口语单元测试

到目前为止,我已经找到了这些包:CGI::TestTest::HTTPHTTP::WebTestTest::WWW::Mechanize

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

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

提前感谢您的帮助。

【问题讨论】:

  • 什么是口语单元测试?

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


【解决方案1】:

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

  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 对其进行测试。

【讨论】:

    【解决方案2】:

    Test::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):

    检查

    ... 标签的内容。测试失败时显示$msg。

    content_contains($content, $msg):

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

    更多值得思考的事情

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

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

    【讨论】:

    • 感谢您的回答。特别是链接和示例非常有帮助。我对它感兴趣的并发性不仅允许两个不同的用户访问,如您的示例中所示,而且还允许在操作第一个用户时进行写访问。后者最多只能使用来自不同机器的多个线程进行测试。很抱歉,其他答案更符合我的问题,但我真的很喜欢并感谢您对 WWW::Mechanize 的超级提示!再次感谢。
    • 很好。但它让我看看你的问题,我也发现了一些非常有用的问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多