symfonyob娱乐下载 1.2的新功能:测试应用程序
symfob娱乐下载ony框架总是与功能测试框架捆绑在一起,这当然是它的主要优势之一。
什么是功能测试?功能测试的目标是测试所有应用程序层的集成:从路由到控制器、模板和数据库调用。它们不能取代单元测试。
唯一不容易测试的是模板中嵌入的JavaScript代码。你当然可以使用工具,比如硒对于这个。但好消息是,功能测试框架可欧宝平台是合法的吗以测试“一些”JavaScript代码,如Ajax调用。
为了完成它的工作,功能测试框架模拟浏览器。它不需要web服务器,因为它知道symfony的内部结构以及如何根据请求生成响应。ob娱乐下载这允许在每个请求之后对应用程序的状态进行简单而深入的内省。当然,您可以自省symfony核心对象(如响应或用户会话),也可以ob娱乐下载自省您自己的代码(如模型)。
symfony的每个版本都使功能ob娱乐下载测试框架变得更好。今天,我将向您展示我们为symfony 1.2版本添加的所有优点。ob娱乐下载准备好惊讶吧!
解耦
大家都知道我非常喜欢测试。我还喜欢重构旧代码,使其变得更好。对于syob娱乐下载mfony 1.2,我重构了浏览器(sfBrowser
)和测试浏览器(sfTextBrowser
类,使它们更加灵活和可配置。
从symfoob娱乐下载ny 1.2开始,功能测试框架由几个不同的可重用层组成。
最大的变化是引入了测试人员。测试人员是知道如何测试应用程序特定层的对象。ob娱乐下载Symfony带有几个内置的测试器,分别用于请求、响应、用户、视图缓存、表单和Propel。
的引入是一个不太重要的变化sfTestFunctional
类,它依赖于asfBrowser
对象测试您的应用程序并管理所有已注册的测试人员.
下面是一个典型的功能测试:
美元的浏览器=新sfTestFunctional(新sfBrowser());美元的浏览器->得到(' / ')->//做一些测试;
为了保持与symfony 1.0和1.1的向后兼容性,您仍然可以使用现已弃用ob娱乐下载的sfTestBrowser
类:
美元的浏览器=新sfTestBrowser();美元的浏览器->得到(' / ')->//做一些测试;
测试人员
因此,所有的测试实际上都是由测试类完成的。测试人员知道如何测试应用程序的特定部分。
测试者取代了你所习惯的所有方法,比如checkResponseElement ()
或isRequestParameter ()
.当然,仍然可以使用这些方法来保持向后兼容性UPGRADE_TO_1_2文件包含一个引用所有旧方法和它们的测试等效方法的表)。
下面是一个简单的示例,演示如何替换isRequestParameter ()
通过使用请求测试器调用:
// symfonyob娱乐下载 1.2之前美元的浏览器->得到(' / ')->isRequestParameter(“模块”,“foo”)->checkResponseElement(“标题”,“foo”);//从symfonob娱乐下载y 1.2开始美元的浏览器->得到(' / ')->与(“请求”)->isParameter(“模块”,“foo”)->checkResponseElement(“标题”,“foo”);
的(请求)
调用将流畅接口的上下文切换到下一个调用的请求测试器对象。所以,isParameter ()
方法是sfTesterRequest
方法。
你也可以创建一个调用块,其中的上下文是测试器对象:
美元的浏览器->得到(' / ')->与(“请求”)->开始()->isParameter(“模块”,“foo”)->isParameter(“行动”,“指数”)->结束()->checkResponseElement(“标题”,“foo”);
之间的所有方法调用开始()
而且结束()
针对当前测试器对象调用。
让我们看看内置测试器类提供的测试方法。
要求测试人员
的请求
测试器定义在sfTesterRequest
类,并包含以下方法:
方法 | 描述 |
---|---|
isParameter |
测试请求参数 |
isMethod |
测试请求方法 |
isFormat |
测试请求格式 |
hasCookie |
测试请求是否具有给定的cookie |
isCookie |
测试cookie的值 |
美元的浏览器->得到(' / ')->与(“请求”)->开始()->isParameter(“模块”,“foo”)->isMethod(“得到”)->isFormat(“html”)->hasCookie(“foo”)->isCookie(“foo”,“酒吧”)->结束();
响应测试仪
的响应
测试器定义在sfTesterResponse
类,并包含以下方法:
方法 | 描述 |
---|---|
isStatusCode |
测试响应状态代码 |
包含 |
使用简单正则表达式测试响应内容 |
isHeader |
测试给定标头的值 |
checkElement |
检查CSS3选择器的值 |
美元的浏览器->得到(' / ')->与(“响应”)->开始()->isStatusCode(200)->包含(“foo”)->isHeader(“内容类型”,“文本/普通”)->checkElement(ul。foo李:去年的,“/ foo /”)->结束();
视图缓存测试器
的视图缓存
测试器定义在sfTesterViewCache
类,并包含以下方法:
方法 | 描述 |
---|---|
isCached |
检查页面/操作是否在缓存中 |
isUriCached |
检查特定URI(可以是部分URI)是否在缓存中 |
美元的浏览器->得到(' / ')->与(“view_cache”)->开始()->isCached(真正的)->isUriCached(“@sf_cache_partial ?模块= foo&action = _partial&sf_cache_key = some_cache_key ')->结束();
用户测试
的用户
测试器定义在sfTesterUser
类,并包含以下方法:
方法 | 描述 |
---|---|
isCulture |
测试用户的区域性 |
isAuthenticated |
检查用户是否通过身份验证 |
hasCredential |
检查用户凭证 |
isAttribute |
测试给定属性的值 |
isFlash |
测试flash变量的值 |
美元的浏览器->得到(' / ')->与(“用户”)->开始()->isCulture(“fr”)->isAuthenticated(真正的)->hasCredential(“管理”)->isAttribute(“sfguard_user_id”,“3”)->isFlash(“通知”,“/ foo /”)->结束();
形式测试器
是时候发现一些新的性感测试者了!
的形式
测试器定义在sfTesterForm
类。它知道在前一个请求中是否使用了表单,是否有对表单对象本身的引用,并允许您对其进行内省。
方法 | 描述 |
---|---|
hasErrors |
检查提交的表单是否有错误 |
返回错误 |
测试给定字段的错误值 |
hasGlobalError |
一样返回错误 但是对于全局误差 |
的返回错误()
方法的第二个参数与checkResponseElement ()
方法。
美元的浏览器->点击(“保存”,数组(…))->与(“形式”)->开始()->hasErrors()->hasGlobalError(“登录名和密码不匹配。”)->返回错误(“名字”,“必须的。”)->返回错误(“名字”,' /要求/)->返回错误(“名字”,”!/无效的)->返回错误(“名字”)->返回错误(“名字”,假)->返回错误(“名字”,1)->结束();
推动测试器
这里是另一个伟大的测试:推动
测试人员。
它不会取代HTML响应检查,但也可以检查浏览器中没有显示但对测试很重要的东西(例如,如果HTML响应检查last_connection
用户的时间戳已经更新,或者文章的浏览次数增加了,…)。
的推动
测试器定义在sfTesterPropel
在驱动插件中,在使用之前必须注册:
美元的浏览器->的地上(“推动”,“sfTesterPropel”);
注册测试器后,您可以在测试中使用它:
美元的浏览器->帖子(' / ')->与(“推动”)->开始()->检查(“文章”,数组(“标题”= >“foo”),假)->检查(“文章”,数组(“标题”= >”!foo”),假)->检查(“文章”,数组(),4)->检查(“文章”,数组(“标题”= >“% foo %”),真正的)->检查(“文章”,数组(“标题”= >”!% foo % '))->检查(“文章”,美元标准)->结束();
的推动
测试器只提供了一个方法:check ()
.这个方法根据你传递给它的参数表现不同:
- 第一个参数是模型类名
- 第二个是a
标准
对象或简单的条件数组 - 第三个可以是:
真正的
检查某些对象是否符合条件假
检查是否没有对象与条件匹配- 或者一个整数来检查匹配对象的数量
扩展或创建一个测试器
使用测试人员有几个优点:
- 隔离:由于测试人员的分离,我们提供了比以前更多的测试方法。
- 可读性:由于块概念和更短的方法名,您的测试更具可读性。
- 可扩展性:您可以用自己的方法扩展每个测试器,或者创建自己的测试器类。
扩展内置测试器
如果你想给现有的测试器添加一些方法,你需要创建一个继承自内置测试器的类,并用你自己的类名重新注册它:
类ApplicationTesterRequest扩展sfTesterRequest{//添加一些测试方法}//在你的功能测试美元的浏览器->的地上(“请求”,“ApplicationTesterRequest”);
如果需要覆盖一堆内置测试人员,可以使用setTesters
方法:
美元的浏览器->setTesters(数组(“请求”= >“ApplicationTesterRequest”,“响应”= >“ApplicationTesterResponse”,));
一个测试方法可以做任何你想做的事情,但必须以以下代码结束,以便流畅接口正确工作:
返回这个美元->getObjectToReturn();
在你的方法中,你可以访问几个对象:
$ this - >浏览器
:当前浏览器对象$ this - >测试人员
:lime_test
对象
创建一个新的测试人员
你也可以通过注册一个唯一的名字来创建一个新的测试类:
美元的浏览器->的地上(“my_tester”,“mytest”);
继承的测试类sfTester
并且必须实现以下方法:
初始化()
:每次使用时都会调用此方法与()
在你的测试中。这对于在请求发送后获取某个对象非常有用:公共函数初始化(){这个美元->请求=这个美元->浏览器->getRequest();}
准备()
:该方法在任何对浏览器对象的调用之前调用。如果您需要在发送请求之前做一些事情,这是非常有用的。
是流利的
当您为一个给定的模块编写大量的功能测试时,了解正在执行的操作的一些可视化信息有时是有用的。新的测试器增加了新的缩进级别,使测试更具可读性。
此外,还有一种新的信息()
方法,该方法输出一些文本以帮助对测试进行分类:
美元的浏览器->信息(“第一个场景:有错误的表单”)->/ /……一些测试信息(“第二种场景:有效的表单提交”)->/ /……更多的测试;
调试测试
当功能测试中出现问题时,传递给浏览器的HTML有助于诊断原因。从symfoob娱乐下载ny 1.2开始,在不中断流畅的界面风格的情况下显示生成的HTML非常容易:
美元的浏览器->得到(' / a_uri_with_an_error ')->与(“响应”)->调试()->//一些不会被执行的测试;
的调试()
方法将输出响应头和内容,并将中断浏览器的流。
相同的调试()
方法存在,用于形式
并输出提交的值和表单错误(如果有的话):
美元的浏览器->帖子(' / post_to_a_form_with_some_errors ')->与(“形式”)->调试()->//一些不会被执行的测试;
今天就到这里。测试您的symfony应用程序从来没有这么容易过。ob娱乐下载所以,我希望新的测试框架能让你相信测试并没有那么难,它能帮你省事。
至于新的Web调试工具栏面板,如果您创建新的测试人员,不要犹豫将它们打包为插件。
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
我坚持,有没有可能把这些伟大的帖子搬到另一个地方,比如维基,让许多用户可以以一种简单的方式贡献??
我认为这将有助于从经验丰富的symfony用户那里记录一些类似的事情……ob娱乐下载
感谢您让我们随时了解sf 1.2的最新变化!!
感谢您用symfony改进测试所做的努力。ob娱乐下载以前很棒,现在更棒了。
关于这张票:在你看来,使用linux cli程序“highlight”过于沉重了吗?
我真的很喜欢突出显示的html输出,因为它的可读性更强。我认为我们也可以在php中直接做到这一点——没有外部依赖。
[http://trac.ob娱乐下载symfony-project.org/ticket/4305]
如果高亮可以独立于操作系统,那就太好了(我现在在工作中使用windows,我错过了很多linux)。
一如既往的伟大工作!
只是…哇。