草庐IT

php - 用 PHP 测试。我怎样才能确保一切正常运行?

coder 2024-01-03 原文

首先不知道是不是叫Unit Testing。如果它有不同的名称,请随时纠正我。

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

假设我正在开发一个表单来将值保存到数据库中。我开发 HTML 和 PHP。我时不时地在浏览器中按 F5 并检查 HTML/jQuery 是否没有错误以及 PHP 是否没有出现诸如缺少分号之类的错误。

当它完成并且一切都准备好进行测试时,我开始测试我的小块代码。喜欢;

  1. -$_POST 数组是否正确地从表单文件中获取值? (我用 print_r 测试)
  2. -“$email”变量是否被正确过滤为有效的电子邮件? (我用不同的可能性对其进行了测试,例如:aaa@bbb、aa@bb.com、a@@b.net 等)
  3. -提交的表单是否通过了所有控制,并成功插入到数据库中? (我检查我的 MySQL 表。)
  4. -表单是否正确显示错误/成功消息?
  5. -...等等

如果它在正确的值下工作,在错误的值下失败;我相信该表单按预期工作并且没有错误,所以我开始做其他事情。

我不想这样做,而是想确保一切正常,否则会在不在浏览器上按 F5 垃圾邮件的情况下通知我问题。

像这样;

<?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页?

如果您能回答我的问题并帮助我成为更好的开发人员,我将非常高兴。

谢谢!

最佳答案

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

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

  • 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 中的测试。


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

最终,您的目标是让您的代码从所有可能的角度持续不断地自动“运行”。这是发现问题的唯一方法。

对于CI软件,个人比较喜欢TeamCity很多,但是JenkinsHudson非常受欢迎,并且有一个 ton of other CI tools .

关于php - 用 PHP 测试。我怎样才能确保一切正常运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15132254/

有关php - 用 PHP 测试。我怎样才能确保一切正常运行?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  9. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  10. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

随机推荐