用PHP测试。如何确保正确运行?

时间:2013-02-28 09:46:59

标签: php testing automated-tests

首先,我不知道它是否被称为单元测试。如果它有不同的名称,请随时纠正我。

我目前正在开发像这样的网络应用程序。

假设我正在开发一个表单来将值保存到数据库中。我开发HTML和PHP。我经常在浏览器中按F5并检查HTML / jQuery是否没有错误,PHP不会出现错误的分号等错误。

当它完成并且一切准备好进行测试时,我开始测试我的代码的一小部分。等;

  1. -Do $ _POST数组是否正确从表单文件中获取值? (我用print_r测试)
  2. - “$ email”变量是否已正确清理为有效的电子邮件? (我用不同的能力测试它,例如:aaa @ bbb,aa @ bb.com,@@ b.net等。)
  3. - 提交的表单是否已通过所有控件,并成功插入数据库? (我查看我的MySQL表。)
  4. - 表单是否正确显示错误/成功消息?
  5. -...等
  6. 如果它使用正确的值,并且使用错误的值失败;我相信表单按预期工作,没有错误,所以我转向其他事情。

    我没有这样做,而是希望确保事情完美无缺,否则会通知我这个问题,而不会在浏览器上发送垃圾邮件。

    喜欢这个;

    <?php
    /* Unit Testing Start --
    -ensure: isset($_POST['submit']) returns TRUE;
    -ensure: isset($email) returns TRUE;
    -ensure: isValidEmail($email) returns TRUE;
    -ensure: connectDatabase() returns TRUE;
    -ensure: getMysqlAffectedRows() returns 1;
    -ensure: hasErrors() returns false;
    */
    
    ?>
    

    我的表单代码,使用我在上面发布的功能。

    当它运行时,它应该向我显示如下消息:(最好还记录它)

    Test complete. Tested (6) possibilities, (4) succeeded, (2) failed. 
    Failed 1: isValidEmail() returned FALSE, expected: TRUE. 
    Failed 2: getMysqlAffectedRows returned NULL/0, expected INTEGER 1.
    

    这样的事情可以节省我很多时间,并且可以更容易地维护我的代码。

    我不想这样做:

    $email = 'xxx@yyy.com';
    echo isValidEmail($email) ? 'true' : 'false';
    

    然后我必须从PHP脚本中删除这些行。测试必须永远留在那里,除非我手动删除它们。它们应该像评论一样,所以在生产网站上,它们不会被执行。但是,在我的开发PC中,我将安装我需要安装的任何内容,并且必须解析/记录这些注释。

    所以,是的。就这样。现在回答问题:

    • 用PHP可以做些什么吗?如果是这样,我该怎么做?

    • 什么叫单元测试,或者是什么?

    • 你们如何测试你开发的内容?

    • 你们如何在不担心的情况下设法开发庞大的Web应用程序; “如果我更改此功能,整个网站可能会中断。”?另外,你如何确定改变功能并没有破坏任何东西? X页面可能正常工作但Y可能因为您之前没想过的内容而被打破。比如,在X页面上除以3可以正常工作,但在Y页面上除以0肯定会出错,但你只检查了X页面?

    如果您能回复我的问题并帮助我成为更好的开发人员,我真的很高兴。

    谢谢!

3 个答案:

答案 0 :(得分:7)

是的,自动化测试是可靠软件开发的基石,正是因为无法通过单击浏览器手动检查所有内容。 单元测试通常是“技术”测试,用于确保特定的“单元”(通常是函数或类)返回指定输入的预期返回值。 功能测试测试更大的代码单元以获得正确的行为。 验收测试从用户的角度测试最终的应用程序。

有许多框架和工具可以满足这些不同的需求:

  • PHPUnit - PHP的事实上的单元测试框架
  • Behat - 一个专注于提供“业务可读”测试的测试框架
  • Codeception - 一个试图兼顾可读性和技术性的框架

以上所有内容都有出色的文档,可以让您更轻松地考虑使用单元测试。我建议你先阅读PHPUnit,然后看看Behat或Codeception可以为你提供什么。


作为一般建议:测试您的代码是否正常运行。不要测试“做什么”,测试你在做某事时是否得到了你期望的结果。例如,不要测试isset($_POST['submit'])。这太详细了,用测试覆盖应用程序的每一行都没有意义。相反,测试更大的代码单元。测试当您提交具有已知给定值的表单时,您的代码会正确地将您重定向到下一页。或者测试您的身份验证系统是否正确拒绝对非特权用户的访问权限。您希望测试读取如下:

Scenario: Login
  Given I am on the login page
  When I log in as user "Jon" with the password "foo"
  Then I should be logged in

或者:

Scenario: Deny unprivileged user
  Given I am logged in as the user "Jon" with access level 1
  When I try to access the action "restricted"
  Then I should be denied access

Scenario: Login
  Given I submit a form with the values "Jon" as username and "foo" as password
  When I check the $_POST array I should see "Jon" in the key "name" and ...
  ...

顺便提一句,上面的字母可以用Behat进行测试。


为了确保您编写的这些测试确实值得,您需要定期运行它们。也许您在版本控制系统中创建一个触发器,以便在签入代码时自动运行测试套件并拒绝检查失败的检查。最好的方法是,如果您设置了 Continuous Integration服务器,它会定期从您的存储库获取最新代码并在其上运行测试。如果你正确设置它,你会自动收到有关在常规开发过程中容易被忽略的各种边缘问题的通知。例如,CI服务器应该每次都尝试从头开始设置和运行应用程序,并且可能会提醒您从依赖的第三方获取依赖关系时出现问题,或者数据库迁移脚本中存在问题。你不会注意到的事情,因为你并不总是获取依赖关系,也不总是重新运行你的迁移脚本。

最后,您的目标是从所有可能的角度自动“持续”运用您的代码。这是找到问题的唯一方法。

对于CI软件,我个人非常喜欢TeamCity,但JenkinsHudson非常受欢迎且有ton of other CI tools

答案 1 :(得分:1)

根据WikiPedia:

  

在计算机编程中,单元测试是个人的一种方法   源代码单元,一个或多个计算机程序模块的集合   连同相关的控制数据,使用程序和操作   程序,进行测试,以确定它们是否适合使用。

我猜你正在做的事可以叫做UnitTesting。

UnitTest的最佳方法是well know framework。 PHP很少见。我猜最受欢迎的是PHPUnit。来测试它的公司会做其他很酷的事情,比如代码覆盖率报告(我确信其他框架也会这样做)。

我在Eclipse上工作,并且我将PHPUnit与我的IDE集成在一起。在开发过程中,我不必在窗口之间切换。我只是运行测试,看看我的代码是否有效。它节省了大量时间。

答案 2 :(得分:0)

听起来你应该查看simpletest