我正在开发像这样的Web应用程序.
假设我正在开发一个表单来将值保存到数据库中.我开发HTML和PHP.我有时间在浏览器中按F5并检查HTML / jQuery是否没有错误,PHP不会出现错误的分号等错误.
当它完成并且一切都准备好进行测试时,我开始测试我的代码的一小部分.喜欢;
> -Do $_POST数组是否正确地从表单文件中获取值? (我用print_r测试)
> – “$email”变量是否正确清理为有效的电子邮件? (我用不同的能力测试它,例如:aaa @ bbb,aa @ bb.com,@@ b.net等)
> – 提交的表单是否通过了所有控件,并成功插入到数据库中? (我查看我的MysqL表.)
> – 表单是否正确显示错误/成功消息?
> -…等.
如果它使用正确的值,并且失败并返回错误的值;我相信表单按预期工作,没有错误,所以我转向其他事情.
而不是这样做,我想确保事情完美无缺,否则在没有垃圾邮件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中进行测试.
为了确保您编写的这些测试实际上是值得的,您需要定期运行它们.也许您在版本控制系统中创建一个触发器,以便在签入代码时自动运行测试套件并拒绝检查失败的检查.但最好的情况是,如果您设置了Continuous Integration服务器,该服务器会定期从您的存储库获取最新代码并在其上运行测试.如果你正确设置它,你会自动收到有关在常规开发过程中容易被忽略的各种边缘问题的通知.例如,CI服务器应该每次都尝试从头开始设置和运行应用程序,并且可能会提醒您从依赖的第三方获取依赖关系时出现问题,或者数据库迁移脚本中存在问题.你不会注意到的事情,因为你并不总是获取依赖关系,也不总是重新运行你的迁移脚本.
最后,您的目标是从所有可能的角度自动“持续”运行您的代码.这是找到问题的唯一方法.
对于CI软件,我个人非常喜欢TeamCity,但Jenkins和Hudson非常受欢迎,有一个ton of other CI tools.