Jobeet——9天:功能测试
以前在Jobeet
昨天,我们看到了如何使用石灰Jobeet类测试单元测试库封装在symfony。ob娱乐下载
今天,我们将编写功能测试的功能我们已经实现工作
和类别
模块。
功能测试
功能测试是一个伟大的工具,从端到端测试应用程序:从请求由浏览器发送的服务器的响应。他们测试应用程序的所有层:路由模型,行动,和模板。他们非常类似于你可能已经做的手工:每次添加或修改一个动作,你需要走到浏览器并检查每件事都按预期工作通过点击链接和检查元素呈现的页面。换句话说,你运行一个场景用例对应您刚刚实施。
这个过程是手动,单调乏味,而且容易出错。每次你改变的东西在你的代码中,您必须遍历所有场景,以确保你没有打破的东西。这是疯狂的。功能测试在symfony提供了一种方便地ob娱乐下载描述场景。每个场景可以自动播放一遍又一遍地在浏览器中通过模拟用户的经验。单元测试一样,他们给你信心代码在和平。
的sfBrowser
类
在syob娱乐下载mfony,功能测试是通过一个特殊的浏览器运行,实现的sfBrowser
类。它作为一个浏览器定制为您的应用程序和直接连接,而不需要一个web服务器。它允许您访问所有symfony对象之前和之后的每一个要ob娱乐下载求,让你有机会反省,做你想做的检查编程。
sfBrowser
提供了方法,模拟导航在一个典型的浏览器:
方法 | 描述 |
---|---|
get () |
得到一个URL |
post () |
发布一个URL |
叫() |
(用于调用一个URL把 和删除 方法) |
回() |
返回上一个页面 |
转发() |
前进一页历史 |
重载() |
重新加载当前页面 |
click () |
点击一个链接或按钮 |
select () |
选择一个radiobutton或复选框 |
取消选择() |
取消选中radiobutton或复选框 |
重启() |
重新启动浏览器 |
下面是一些使用的例子sfBrowser
方法:
美元的浏览器=新sfBrowser();布劳尔美元- >得到(' / ')- >点击(“设计”)- >得到(“页面/类别/编程吗? = 2”)- >得到(“/类别/编程”,数组(“页面”= >2))- >帖子(“搜索”,数组(“关键词”= >“php”));
sfBrowser
包含额外的方法来配置浏览器行为:
方法 | 描述 |
---|---|
setHttpHeader () |
设置HTTP头 |
setAuth () |
设置基本的身份验证凭证 |
setCookie () |
设置一个饼干 |
removeCookie () |
删除一个饼干 |
clearCookie () |
清除当前所有饼干 |
followRedirect () |
遵循一个重定向 |
的sfTestFunctional
类
我们有一个浏览器,但是我们需要一种方法来反省symfony对象来进行实际的测试。ob娱乐下载这是可以做到与石灰和一些sfBrowser
方法如getResponse ()
和getRequest ()
但是syob娱乐下载mfony提供了一个更好的方法。
提供的测试方法是另一个类,sfTestFunctional
这需要一个sfBrowser
实例构造函数。的sfTestFunctional
类代表测试测试人员对象。几个测试人员与symfony绑定,您还可以创建自己的。ob娱乐下载
正如我们昨天看到的,功能测试存储下测试/功能
目录中。Jobeet,测试中发现的测试/功能/前端
子目录,每个应用程序都有自己的子目录中。这个目录已经包含两个文件:categoryActionsTest.php
,jobActionsTest.php
因为所有的任务自动生成模块创建一个基本的功能测试文件:
/ /测试/功能/前端/ categoryActionsTest.php包括(目录名(__FILE__)。“/ . . / . . /引导/ functional.php”);美元的浏览器=新sfTestFunctional(新sfBrowser());美元的浏览器- >得到(“/类别/指数”)- >与(“请求”)- >开始()- >isParameter(“模块”,“类别”)- >isParameter(“行动”,“指数”)- >结束()- >与(“响应”)- >开始()- >isStatusCode(200年)- >checkElement(“身体”,”!/这是一个临时的页面的)- >结束();
起初,上面的脚本可能看起来有点奇怪。这是因为的方法sfBrowser
和sfTestFunctional
总是返回这个美元
启用连贯接口。它可以让你更好的可读性的方法调用链。
测试是在一个测试块上下文中运行。始于一个测试块上下文(测试人员名字)- >开始()
和结尾结束()
:
美元的浏览器- >与(“请求”)- >开始()- >isParameter(“模块”,“类别”)- >isParameter(“行动”,“指数”)- >结束();
代码测试请求参数模块
=类别
和行动
=指数
。
当你只需要调用一个测试方法在一个测试人员,你不需要创建一个块:
(“请求”)- > isParameter(“模块”,“类别”)
。
的要求测试人员反省和测试提供了测试方法sfWebRequest
对象:
方法 | 描述 |
---|---|
isParameter () |
检查一个请求参数的值 |
isFormat () |
检查请求的格式 |
isMethod () |
检查的方法 |
hasCookie () |
检查请求是否有饼干的 |
名字 | |
isCookie () |
检查一个cookie的值 |
还有一个响应测试仪类,它提供了对测试的方法sfWebResponse
对象:
方法 | 描述 |
---|---|
checkElement () |
检查是否响应匹配标准的CSS选择器 |
isHeader () |
检查一个头的值 |
isStatusCode () |
检查响应状态码 |
isRedirected () |
检查当前的反应是一个重定向 |
我们将介绍更多测试人员类在未来几天(形式、用户缓存,…)。
运行功能测试
对于单元测试,发射功能测试可以通过直接执行测试文件:
php测试/功能/前端/ categoryActionsTest.php美元
或通过使用功能测试:
任务:
美元php ob娱乐下载symfony测试:功能前端categoryActions
测试数据
至于推动单元测试,我们需要加载每次我们推出一个功能测试的测试数据。昨天我们可以重用代码编写:
包括(目录名(__FILE__)。“/ . . / . . /引导/ functional.php”);美元的浏览器=新JobeetTestFunctional(新sfBrowser());美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_test_dir”)。/设备的);
加载数据功能测试在单元测试中有点容易引导已经初始化数据库的脚本。
对于单元测试,我们不会复制和粘贴这段代码在每个测试文件,但我们将创建自己的功能的类继承自sfTestFunctional
:
/ / lib /测试/ JobeetTestFunctional.class.php类JobeetTestFunctional扩展sfTestFunctional{公共函数loadData(){美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_test_dir”)。/设备的);返回这个美元;}}
编写功能测试
编写功能测试在浏览器就像玩一个场景。我们已经写了所有的场景,我们需要测试的第二天的故事。
首先,让我们测试Jobeet主页通过编辑jobActionsTest.php
测试文件。用以下代码替换代码:
过期的职位没有列出
/ /测试/功能/前端/ jobActionsTest.php包括(目录名(__FILE__)。“/ . . / . . /引导/ functional.php”);美元的浏览器=新JobeetTestFunctional(新sfBrowser());美元的浏览器- >loadData();美元的浏览器- >信息(“1 -主页”)- >得到(' / ')- >与(“请求”)- >开始()- >isParameter(“模块”,“工作”)- >isParameter(“行动”,“指数”)- >结束()- >与(“响应”)- >开始()- >信息(“1.1 -过期未列出的工作”)- >checkElement(”。乔布斯td.position:包含(“过期”),假)- >结束();
与石灰
,可以通过调用插入一个信息性消息信息()
方法使输出更加可读。排除工作到期的主页,我们检查的CSS选择器指导td.position:包含(“过期”)
不匹配的任何地方响应的HTML内容(请记住,在夹具文件,唯一过期的工作我们有包含“过期”的位置)。
的
checkElement ()
方法是能够解释最有效的CSS3选择器。
只有n工作类别列出
添加以下代码的测试文件:
/ /测试/功能/前端/ jobActionsTest.php美元最大= sfConfig::得到(“app_max_jobs_on_homepage”);美元的浏览器- >信息(“1 -主页”)- >得到(' / ')- >信息(sprintf(“1.2——只有% s工作列出一个类别的,美元最大))- >与(“响应”)- >checkElement(”。category_programming tr的,美元最大);
的checkElement ()
方法还可以检查一个CSS选择器匹配n次。
一个类别有一个链接到目录页只有太多的工作
美元的浏览器- >信息(“1 -主页”)- >得到(' / ')- >信息(“1.3 -一个类别有一个链接到目录页只有太多的乔布斯)- >与(“响应”)- >开始()- >checkElement(”。category_design .more_jobs”,假)- >checkElement(”。category_programming .more_jobs”)- >结束();
在这里,我们检查没有“更多就业机会”链接设计类别(.category_design .more_jobs
不存在),有一个“工作岗位”链接的编程类(.category_programming .more_jobs
确实存在)。
工作是按日期排序
/ /最近在编程工作类别美元标准=新标准();美元标准- >添加(JobeetCategoryPeer::鼻涕虫,“编程”);美元的类别= JobeetCategoryPeer::doSelectOne(美元标准);美元标准=新标准();美元标准- >添加(JobeetJobPeer::EXPIRES_AT,时间()标准::GREATER_THAN);美元标准- >addDescendingOrderByColumn(JobeetJobPeer::CREATED_AT);美元的工作= JobeetJobPeer::doSelectOne(美元标准);美元的浏览器- >信息(“1 -主页”)- >得到(' / ')- >信息(1.4 -工作是按日期排序的)- >与(“响应”)- >开始()- >checkElement(”。category_programming tr:去年:包含(“102”))- >checkElement(sprintf(”。category_programming tr:第一(href * = " / % d /”)”,美元的工作- >getId()))- >结束();
为了测试工作实际上是按日期排序,我们检查的最后一份工作主页包含上市102年
在公司里。但是测试编程列表上的第一份工作是棘手的前两份工作相同的位置,公司,和位置。因此,我们需要检查URL包含预期的主键。之间的主键可以改变,我们需要先将对象从数据库中。
即使测试工作,我们需要重构代码,得到第一份工作的编程类可以重用在其他地方在我们的测试中。我们不会将代码移动到模型层测试特定的代码。相反,我们将代码JobeetTestFunctional
我们之前已经创建了类。这个类作为一个领域特定functional tester Jobeet类:
/ / lib /测试/ JobeetTestFunctional.class.php类JobeetTestFunctional扩展sfTestFunctional{公共函数getMostRecentProgrammingJob(){/ /最近在编程工作类别美元标准=新标准();美元标准- >添加(JobeetCategoryPeer::鼻涕虫,“编程”);美元的类别= JobeetCategoryPeer::doSelectOne(美元标准);美元标准=新标准();美元标准- >添加(JobeetJobPeer::EXPIRES_AT,时间()标准::GREATER_THAN);美元标准- >addDescendingOrderByColumn(JobeetJobPeer::CREATED_AT);返回JobeetJobPeer::doSelectOne(美元标准);}/ /……}
每个工作在主页上点击
美元的浏览器- >信息(“2 -工作页面”)- >得到(' / ')- >信息(“2.1——每个工作在主页上点击“)- >点击(Web开发人员的,数组(“位置”= >1))- >与(“请求”)- >开始()- >isParameter(“模块”,“工作”)- >isParameter(“行动”,“显示”)- >isParameter(“company_slug”,“sensio-labs”)- >isParameter(“location_slug”,法国巴黎的)- >isParameter(“position_slug”,web开发人员的)- >isParameter(“id”,美元的浏览器- >getMostRecentProgrammingJob()- >getId())- >结束();
要测试主页上的链接工作,我们模拟一个点击“Web开发人员”文本。在页面上有很多人,我们有明确要求浏览器单击第一个(数组(“位置”= > 1)
)。
每个请求参数然后测试确保路由正确地做了它的工作。
学习的例子
在本节中,我们提供了所需的所有代码测试工作和类别页。仔细阅读代码,你可以学习一些新的整洁的技巧:
/ / lib /测试/ JobeetTestFunctional.class.php类JobeetTestFunctional扩展sfTestFunctional{公共函数loadData(){美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_test_dir”)。/设备的);返回这个美元;}公共函数getMostRecentProgrammingJob(){/ /最近在编程工作类别美元标准=新标准();美元标准- >添加(JobeetCategoryPeer::鼻涕虫,“编程”);美元的类别= JobeetCategoryPeer::doSelectOne(美元标准);美元标准=新标准();美元标准- >添加(JobeetJobPeer::EXPIRES_AT,时间()标准::GREATER_THAN);美元标准- >addDescendingOrderByColumn(JobeetJobPeer::CREATED_AT);返回JobeetJobPeer::doSelectOne(美元标准);}公共函数getExpiredJob(){/ /过期的工作美元标准=新标准();美元标准- >添加(JobeetJobPeer::EXPIRES_AT,时间()标准::LESS_THAN);返回JobeetJobPeer::doSelectOne(美元标准);}}/ /测试/功能/前端/ jobActionsTest.php包括(目录名(__FILE__)。“/ . . / . . /引导/ functional.php”);美元的浏览器=新JobeetTestFunctional(新sfBrowser());美元的浏览器- >loadData();美元的浏览器- >信息(“1 -主页”)- >得到(' / ')- >与(“请求”)- >开始()- >isParameter(“模块”,“工作”)- >isParameter(“行动”,“指数”)- >结束()- >与(“响应”)- >开始()- >信息(“1.1 -过期未列出的工作”)- >checkElement(”。乔布斯td.position:包含(“过期”),假)- >信息(sprintf(“1.2——只有% s工作列出一个类别的,sfConfig::得到(“app_max_jobs_on_homepage”)))- >checkElement(”。category_programming tr的,sfConfig::得到(“app_max_jobs_on_homepage”))- >信息(“1.3 -一个类别有一个链接到目录页只有太多的乔布斯)- >checkElement(”。category_design .more_jobs”,假)- >checkElement(”。category_programming .more_jobs”)- >信息(1.4 -工作是按日期排序的)- >checkElement(sprintf(”。category_programming tr:第一(href * = " / % d /”)”,美元的浏览器- >getMostRecentProgrammingJob()- >getId()))- >checkElement(”。category_programming tr:去年:包含(“102”))- >结束();美元的浏览器- >信息(“2 -工作页面”)- >信息(“2.1——每个工作在主页上点击并给出详细的信息)- >点击(Web开发人员的,数组(“位置”= >1))- >与(“请求”)- >开始()- >isParameter(“模块”,“工作”)- >isParameter(“行动”,“显示”)- >isParameter(“company_slug”,“sensio-labs”)- >isParameter(“location_slug”,法国巴黎的)- >isParameter(“position_slug”,web开发人员的)- >isParameter(“id”,美元的浏览器- >getMostRecentProgrammingJob()- >getId())- >结束()- >信息(2.2 -一个不存在的工作将用户转发到404)- >得到(' /工作/ foo-inc / milano-italy / 0 /画家”)- >与(“响应”)- >isStatusCode(404年)- >信息(2.3 -一个过期的工作页面转发用户404的)- >得到(sprintf(' /工作/ sensio-labs /法国巴黎/ % d / web开发人员的,美元的浏览器- >getExpiredJob()- >getId()))- >与(“响应”)- >isStatusCode(404年);/ /测试/功能/前端/ categoryActionsTest.php包括(目录名(__FILE__)。“/ . . / . . /引导/ functional.php”);美元的浏览器=新JobeetTestFunctional(新sfBrowser());美元的浏览器- >loadData();美元的浏览器- >信息(“1 -类别页面”)- >信息(在主页上的1.1 -类别可点击的)- >得到(' / ')- >点击(“编程”)- >与(“请求”)- >开始()- >isParameter(“模块”,“类别”)- >isParameter(“行动”,“显示”)- >isParameter(“鼻涕虫”,“编程”)- >结束()- >信息(sprintf(“1.2 -类别有超过% s工作也有一个“更多”链接的,sfConfig::得到(“app_max_jobs_on_homepage”)))- >得到(' / ')- >点击(“22”)- >与(“请求”)- >开始()- >isParameter(“模块”,“类别”)- >isParameter(“行动”,“显示”)- >isParameter(“鼻涕虫”,“编程”)- >结束()- >信息(sprintf(1.3——只有%年代乔布斯列出,sfConfig::得到(“app_max_jobs_on_category”)))- >与(“响应”)- >checkElement(”。乔布斯tr的,sfConfig::得到(“app_max_jobs_on_category”))- >信息(“1.4 -是分页列出的工作”)- >与(“响应”)- >开始()- >checkElement(“.pagination_desc”,/ 32工作的)- >checkElement(“.pagination_desc”,“# 1/2页#”)- >结束()- >点击(' 2 ')- >与(“请求”)- >开始()- >isParameter(“页面”,2)- >结束()- >与(“响应”)- >checkElement(“.pagination_desc”,“#页面2/2 #”);
调试功能测试
有时一个功能测试失败。因为sob娱乐下载ymfony模拟浏览器没有任何图形界面,很难诊断问题。谢天谢地,symfonyob娱乐下载提供了调试()
方法输出响应头和内容:
美元的浏览器- >与(“响应”)- >调试();
的调试()
方法可以插入任何地方响应
测试块并将停止脚本执行。
功能测试工具
的功能测试:
任务也可以用于启动应用程序的所有功能测试:
美元php ob娱乐下载symfony测试:功能的前端
任务为每个测试文件输出一行:
测试工具
正如您可能期望的那样,还有一个任务启动项目的所有测试(单元测试和功能):
php syob娱乐下载mfony测试:美元
明天见
以上就是我们旅游symfony的测试工具。ob娱乐下载你没有理由再也不测试您的应用程序!石灰框架和功能测试框架,symfony提供了强大的工具来帮助你编写测试。ob娱乐下载
我们刚刚触及表面的功能测试。从现在开始,每次我们实现一个功能,我们还将学习更多的功能编写测试的测试框架。
功能测试框架取代工具不像”硒”。硒直接在浏览器中运行自动化测试在许多平台和浏览器,它可以测试应用程序的JavaScript。
明天一定要回来,我们会谈论symfony的另一大特点:形式框架。ob娱乐下载
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
我在许多项目使用symfob娱乐下载ony 1.0。但我不理解为什么我们使用/需要所有这些测试吗?有文档关于为什么我们使用它吗?都是关于我们如何做functinal测试。
对不起,我的英语。
发现了一些问题。
过期的工作需要设置任何expires_at日期在过去,否则它将在未来日期和方法JobeetTestFunctional - > getExpiredJob()返回null。
另一个问题是使用symfony测试:所有ob娱乐下载
有时候失败测试jobActionsTest # 11
(isParameter (“company_slug”、“sensio-labs”) - >)
很好的教程symfony的测试功能。ob娱乐下载
艾克我改变了比赛,这成为昨天的created_at价值生成的条目。这是保证sensio赞助编程工作是主页上的第一次。
就我而言可以删除的类别查询getMostRecentProgrammingJob,因为它没有使用。
因为我有点邋遢会话# 07年我忘记主页上的“更多”功能。测试显示我:)
问候,
马丁
感谢这个伟大的教程。
正如马丁已经提到的,是类对象中未使用“getMostRecentProgrammingJob ()”。
你必须通过添加以下行修改的工作标准
美元标准- >添加(JobeetJobPeer:: CATEGORY_ID添加,$分类- > getId ());
希望工作原理:-)
checkElement ('。类别_programming tr:last:contains("102")')->
改变包含()内的数字并不做任何事……
致命错误:调用成员函数getToken()在非/用户/ web / var /代码/共同/ symfony-1.2.1 / lib /插件/ sfPropelPlugin / lib /路由/ob娱乐下载 sfPropelRoute.class。php在第124行
我真的不明白,不知道去哪里搜索。
但是我认为sfDomCssSelector无法理解“tr:去年:包含(“102”)。