如何测试一个应用程序吗?
symfob娱乐下载ony框架一直捆绑功能测试框架,它肯定是它的主要优势之一。
什么是功能测试?功能测试的目的是测试应用程序所有的集成层:从路由控制器,模板和数据库调用。他们不替换单元测试。
唯一不能测试容易JavaScript代码嵌入在你的模板。你当然可以使用的工具硒对于这个。但好消息是,功能测试框架可欧宝平台是合法的吗以测试“一些”像Ajax调用JavaScript代码。
做它的工作,功能测试框架模拟浏览器。它不需要一个web服务器,它知道symfony内部以及如何生成一个基于请求的响应。ob娱乐下载这允许简单而深刻的内省状态的每个请求后您的应用程序。当然你可以反省symfony核心对象像响应或用户会话,而且自己的代ob娱乐下载码模型。
每个版本的symfony的功能测ob娱乐下载试框架更好。今天,我将向您展示所有symfony的善良我们增加了1.2版本。ob娱乐下载准备好惊讶!
解耦
每个人都知道我非常喜欢测试。我也喜欢重构旧代码以使它更好。symfob娱乐下载ony 1.2,重构浏览器(sfBrowser
)和测试浏览器(sfTestBrowser
)类,使它们更加灵活和可配置。
symfonob娱乐下载y 1.2,功能测试框架是由几个不同的和可重用的层。
最大的变化是引入测试人员。测试人员对象知道如何测试一个特定的应用程序层。ob娱乐下载Symfony提供了几个内置的测试人员的请求,响应,用户视图缓存,形式,和推动。
一个不太重要的变化是引入sfTestFunctional
类,这依赖于一个sfBrowser
对象测试应用程序和管理所有注册测试人员。
这是一个典型的功能测试:
美元的浏览器=新sfTestFunctional(新sfBrowser());美元的浏览器- >得到(' / ')- >/ /做一些测试;
保持向后兼容symfony 1.0和1.1,您仍然可以使用现在弃用ob娱乐下载sfTestBrowser
类:
美元的浏览器=新sfTestBrowser();美元的浏览器- >得到(' / ')- >/ /做一些测试;
测试人员
因此,所有的测试实际上是由测试人员完成课程。一个测试人员知道如何测试您的应用程序的特定部分。
测试人员替换所有的方法,checkResponseElement ()
或isRequestParameter ()
。当然,这些方法仍保持向后兼容性(可用UPGRADE_TO_1_2文件包含一个表引用所有的旧方法及其测试等效)。
这是一个简单的例子,演示了如何取代isRequestParameter ()
电话使用请求测试人员:
/ / symfonob娱乐下载y 1.2之前美元的浏览器- >得到(' / ')- >isRequestParameter(“模块”,“foo”)- >checkResponseElement(“标题”,“foo”);/ / symfoob娱乐下载ny的1.2美元的浏览器- >得到(' / ')- >与(“请求”)- >isParameter(“模块”,“foo”)- >checkResponseElement(“标题”,“foo”);
的(请求)
电话交换机的上下文连贯接口请求测试对象的下一个电话。所以,isParameter ()
方法是一个sfTesterRequest
方法。
您还可以创建一个块的调用上下文的测试对象:
美元的浏览器- >得到(' / ')- >与(“请求”)- >开始()- >isParameter(“模块”,“foo”)- >isParameter(“行动”,“指数”)- >结束()- >checkResponseElement(“标题”,“foo”);
所有的方法调用开始()
和结束()
针对当前测试对象被称为。
让我们看看测试方法提供的内置测试类。
要求测试人员
的请求
测试人员的定义sfTesterRequest
类和包含以下方法:
方法 | 描述 |
---|---|
isParameter |
测试一个请求参数 |
isMethod |
测试请求方法 |
isFormat |
测试要求的格式 |
hasCookie |
测试如果请求给定的饼干 |
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(部分)在缓存中 |
美元的浏览器- >得到(' / ')- >与(“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响应检查但还意味着检查东西显示在浏览器中但不重要的测试(例如,如果last_connection
时间戳对于已经更新的用户,或者一篇文章观点的数量一直在增加,……)。
的推动
测试人员定义sfTesterPropel
推动插件,使用前必须注册:
美元的浏览器- >的地上(“推动”,“sfTesterPropel”);
测试人员注册后,您可以使用它在你的测试:
美元的浏览器- >帖子(' / ')- >与(“推动”)- >开始()- >检查(“文章”,数组(“标题”= >“foo”),假)- >检查(“文章”,数组(“标题”= >“foo !”),假)- >检查(“文章”,数组(),4)- >检查(“文章”,数组(“标题”= >“% foo %”),真正的)- >检查(“文章”,数组(“标题”= >“! % foo %”))- >检查(“文章”,美元标准)- >结束();
的推动
测试人员只提供了一个方法:check ()
。该方法以不同的方式表现基于传递给它的参数:
- 第一个参数是模型类名称
- 第二个是一个
标准
对象或一个简单的一系列条件 - 第三个可以:
真正的
检查一些对象匹配条件假
检查,没有对象匹配条件- 或一个整数检查匹配对象的数量
扩展或创建一个测试人员
使用测试人员有漂亮几分优势:
- 隔离:由于测试人员的分离,我们提供了比以前更多的测试方法。
- 可读性:你的测试更可读,多亏了块概念和较短的方法名称。
- 可扩展性:你可以用你自己的方法或扩展每个测试人员创建您自己的测试类。
扩展一个内置的测试仪
如果你想添加一些现有的测试方法,您需要创建一个类继承自内置的测试人员和注册它自己的类名:
类ApplicationTesterRequest扩展sfTesterRequest{/ /添加一些测试方法}/ /功能测试美元的浏览器- >的地上(“请求”,“ApplicationTesterRequest”);
如果你需要覆盖很多内置的测试人员,您可以使用setTesters
方法:
美元的浏览器- >setTesters(数组(“请求”= >“ApplicationTesterRequest”,“响应”= >“ApplicationTesterResponse”,));
测试方法可以做任何你喜欢的但必须始终连贯接口使用以下代码正常工作:
返回这个美元- >getObjectToReturn();
在你的方法,你可以访问几个对象:
$ this - >浏览器
:当前浏览器对象$ this - >测试人员
:lime_test
对象
创建一个新的测试
您还可以创建新的测试类通过注册一个唯一的名称:
美元的浏览器- >的地上(“my_tester”,“mytest”);
一个测试类继承自sfTester
并必须实现以下方法:
初始化()
:每次你使用调用此方法与()
在你的测试。这是得到一些有用的对象请求发送后:公共函数初始化(){这个美元- >请求=这个美元- >浏览器- >getRequest();}
准备()
:这个方法被调用之前任何调用浏览器对象。这是有用的,如果你需要做一些之前请求被发送。
是流利的
当你写很多功能测试对于一个给定的模块,它有时是有用的有一些视觉信息是什么。缩进的新测试人员增加了一个新的高度,使测试更加可读。
另外,有一个新的信息()
方法,输出一些文本帮助分类你的测试:
美元的浏览器- >信息(第一个场景:形式与错误的)- >/ /……一些测试信息(第二个场景:有效的表单提交的)- >/ /……更多的测试;
调试测试
当问题发生在功能测试,转移到浏览器的HTML帮助诊断病因。symfonob娱乐下载y的1.2,这是很容易显示生成的HTML没有打断流利的界面风格:
美元的浏览器- >得到(' / a_uri_with_an_error ')- >与(“响应”)- >调试()- >/ /一些测试,不会被执行;
的调试()
方法将输出响应头和内容,将中断的浏览器。
相同的调试()
方法存在形式
测试器和输出错误如果任何提交的价值和形式:
美元的浏览器- >帖子(' / post_to_a_form_with_some_errors ')- >与(“形式”)- >调试()- >/ /一些测试,不会被执行;
今天就到这儿了。它从未symfony应用程序更容易测试。ob娱乐下载所以,我希望新的测试框架将努力说服你,这并不是说,它可以节省你的一天。
至于新web调试工具栏板,如果你创建新的测试人员,不要犹豫地包插件。
这个工作许可适用创作共用署名下衍生著作3.0 Unported许可执照。