专家:一个重构的故事(2/5)
重构代码意味着很大的变化。这意味着你需要一种方法来检查过程中,不要破坏任何东西。所以,在开始重构会话之前,我问文斯对其单元测试和功能测试套件中。
不过文斯没有单元测试或功能测试。所以,我们决定写一些功能测试开始前重构。
symf欧宝娱乐app下载地址ony的浏览器
在sy欧宝娱乐app下载地址mfony中,您可以测试您的应用程序通过模拟一个浏览器,多亏了sfTestBrowser
类。这节课表现得像一个真正的浏览器,但它不使用HTTP层symfony。欧宝娱乐app下载地址这有两个主要优点:它是更快,你可以内省symfony后每个请求的对象。欧宝娱乐app下载地址
/ /测试/功能/前端/ productActionsTest.php包括(目录名(__FILE__)。“/ . . / . . /引导/ functional.php”);美元的浏览器=新sfTestBrowser();
固定装置
我们需要可再生的测试,我们需要确保数据库内容总是相同的,当我们启动我们的测试。所以,我问文斯创建一些测试数据:
/ /数据/设备/产品。yml类别:toy_story:名称:玩具总动员瓦力:名称:瓦力产品:U-Command:标题:U命令瓦力形象:walle.jpg描述:|行动填充墙E与现实的表情,发光的眼睛,原来的电影声音和声音效果发送即时订单或预排程序的操作序列,通过无线遥控和墙E会执行你的命令可编程序远程控制1000和更多的行动组合10项目按钮表情,声音,自解压,跳舞,运动和更真实面运动价格:59.99 is_new:真正的is_in_stock:真正的category_id添加:瓦力Interaction-Eve:标题:交互夏娃形象:eve.jpg描述:|前夕以惊人的发光眼睛的表情,动作,原始电影的声音和声音效果跟它;把它害怕或按下一个按钮和itA会回应抬起了飞行模式和声音效果提高夏娃的右臂炮爆破工听起来也反应交互瓦力,这是单独出售价格:65.99 is_new:真正的is_in_stock:真实category_id添加:瓦力售货:标题:瓦力迷你图组图片:set.jpg描述:|全套8数据很难找到自动售货机数据详细小数字,大约1.5英寸高价格:6.99 is_new:真正的is_in_stock:假category_id添加:瓦力胡迪:标题:玩具总动员伍迪形象:woody.jpg描述:|伍迪特性利用电子短语和带有有趣的消防救援配件!包括3个纽扣电池。伍迪说话有气喘的人物,燃烧的大楼,牛仔帽,救援锤,救援背包和水弹。4岁及以上。价格:24.99 is_new:假is_in_stock:真category_id添加:toy_story
在这个夹具文件中,我们创建了两个类别和四个产品。所有产品在库存中,除了“瓦力迷你图组”产品。
加载装置的数据文件中,我们使用sfPropelData
类。默认情况下,sfPropelData
删除所有的数据表我们进口,所以它开始用干净的数据库。
/ /初始化数据库与夹具databaseManager美元=新sfDatabaseManager(美元配置);美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_data_dir”)。/设备的);
欧宝娱乐app下载地址symfony使用的数据库配置测试
当你在功能测试上下文环境。所以,如果你不想搞砸你的默认开发数据库,创建一个特定的配置通过添加测试
条目的databases.yml
配置文件。
现在,每次执行这个脚本,清理数据库和数据加载装置。所以,即使我们的测试修改数据,它不会影响下一个测试运行。
CSS3选择器
主页上,我们需要确保我们有一个产品列表,和所有产品显示页面上的股票。让我们测试,显示“玩具总动员伍迪”的产品,而不是“瓦力迷你图组”的产品:
美元的浏览器- >得到(' / ')- >isStatusCode(200年)- >isRequestParameter(“模块”,“产品”)- >isRequestParameter(“行动”,“指数”)- >checkResponseElement(“身体”,“玩具总动员伍迪/”)- >checkResponseElement(“身体”,”!/Wall-E Mini Figure Set/');
这个脚本是不言而喻的:
- 主页(
/
) - 检查
身体
我们正在寻找内容包含产品标题 - 检查页面不包含这个产品没有存货
当一个产品是新的(is_new
列),“新!“文本添加标题后。编写测试前检查是否工作正常,让看看主页模板:
我们产品<标题> < / h1 >< ? phpforeach(美元的产品作为美元的产品):? >< div > < h2 >< ? php回声美元的产品- >getTitle()? >< ? php如果(美元的产品- >getIsNew()):? > < span =风格“margin-left: 10 px;颜色:# e55”>新! < / span > < ? phpendif;? >< / h2 > < div =风格“margin-bottom: 10 px”> < / em > < em >类别:< ? php回声美元的产品- >getCategory()- >getName()? >- < em > < / em >价格:$ < ? php回声美元的产品- >getPrice()? >- - - - - -< ? php如果(in_array(美元的产品- >getId(),中的(sf_user美元- >getAttribute(“最爱”,数组())))):? >< a href =“< ?php echo url_for(“产品/ removeFromFavorites ? id =”。$产品- > getId ()) ? > "> < img src =“/图片/ favorite.png”/ > < / >< ? php其他的:? ><小> < ? php回声link_to(“添加到我的最爱”,“产品/ addToFavorites id = ?”。美元的产品- >getId())? > < /小>< ? phpendif;? >< / div > = < div > < div风格“浮动:左”> < img宽度=“100 px”src =“/图片/产品/ < ?php echo $产品- > getImage () ? > "/ > < / div > < p >< ? php回声美元的产品- >getDescription()? >< ? php如果(sf_user美元- >isAuthenticated()):? >< p风格=“text-align:正确的”> < a href =“< ?php echo url_for(“产品/编辑? id =”。$产品- > getId ()) ? > ">编辑这个产品< / > < / p >< ? phpendif;? >< / p > < br风格=“明确:“/ > < / div > < div =风格“text-align:正确的”>< ? php回声link_to(image_tag(“/图片/ add_to_cart.png”),“产品/买? id =”。美元的产品- >getId())? >< / div > <人力资源/ > < / div >< ? phpendforeach;? >
来检查新
文本添加产品标题后,我们不能测试新
在body标签,我们需要更精确。在sy欧宝娱乐app下载地址mfony中,这是很简单的checkResponseElement ()
方法使用CSS3选择器作为其第一个参数:
美元的浏览器- >得到(' / ')- >checkResponseElement(“h2:包含(“新”)”,2);
在这里,我们测试,我们有两个h2
标签包含文本新
。
现在,我们需要测试“编辑这个产品”的过程。场景如下:
- 以管理员身份登录
- 点击“编辑这个产品”链接
- 表单填充一些新的价值观和上传一个新文件
- 提交表单
- 检查提交的值一直在考虑主页
- 签署了
以管理员身份登录,我们需要点击“登录”链接:
美元的浏览器- >点击(“signin”)- >isRedirected()- >isRequestParameter(“模块”,“用户”)- >isRequestParameter(“行动”,“signin”)- >followRedirect()- >isStatusCode(200年)- >isRequestParameter(“模块”,“产品”)- >isRequestParameter(“行动”,“指数”)- >checkResponseElement(“身体”,“! / signin /”)- >checkResponseElement(“身体”,“signout /”);
经过验证,signin
行动将用户重定向回首页。然后我们检查“signin”链接不存在了,取而代之的是一个“signout”链接。
现在我们是认证,我们可以点击“编辑这个产品”链接。但有几个与这个名字。假设我们想点击第二个:
/ / symfony 1.2中的新位置属性欧宝娱乐app下载地址美元的浏览器- >点击(编辑这个产品的,数组(),数组(“位置”= >2))- >isStatusCode(200年)- >isRequestParameter(“模块”,“产品”)- >isRequestParameter(“行动”,“编辑”)- >checkResponseElement(“氢气”,' / U命令瓦力/ ');
页面上的一些基本的检查后,我们准备提交表单:
美元的浏览器- >点击(“保存”,数组(“产品”= >数组(“价格”= >“十”,“图像”= >目录名(__FILE__)。“/ . . / . . / . . / web /图片/产品/ eve.jpg ',“is_new”= >假,)));
当你点击一个按钮,你可以通过你想要覆盖的值字段。在这个例子中,我们已经改变了价格
值时,is_new
价值,我们有上传图片给我们想上传的文件的完整路径。
检查后,我们被重定向到主页,我们可以检查我们的变化考虑:
美元的浏览器- >isRedirected()- >followRedirect()- >isStatusCode(200年)- >isRequestParameter(“模块”,“产品”)- >isRequestParameter(“行动”,“指数”)checkResponseElement(“h2:包含(“新”)”,1)- >checkResponseElement(sprintf(“img src = " % s "]美元”,sha1(“eve.jpg”)。“jpg”));
我们现在可以签:
美元的浏览器- >点击(“signout”)- >isRequestParameter(“模块”,“用户”)- >isRequestParameter(“行动”,“signout”)- >isRedirected()- >followRedirect()- >isStatusCode(200年)- >isRequestParameter(“模块”,“产品”)- >isRequestParameter(“行动”,“指数”)- >checkResponseElement(“身体”,“signin /”)- >checkResponseElement(“身体”,“! / signout /”);
现在,每次我们做出改变的代码,我们启动功能测试确保我们不休息过程中一些功能:
美元php 欧宝娱乐app下载地址symfony测试:功能前端productActions
特定于应用程序的浏览器
我们写的功能测试是非常简单的,当然,我们将不得不写一些更涵盖所有网站的功能。随着你的测试套件,我们可能会复制粘贴一些代码,例如登录和退出过程。为了避免一次又一次地重复相同的过程,这通常是一个好主意来创建一个特定于应用程序的浏览器类和定制它为您的应用程序:
类StoreBrowser扩展sfTestBrowser{公共函数signin(){返回这个美元- >得到(“/ user / signin”)- >isRedirected()- >isRequestParameter(“模块”,“用户”)- >isRequestParameter(“行动”,“signin”)- >followRedirect()- >isStatusCode(200年)- >isRequestParameter(“模块”,“产品”)- >isRequestParameter(“行动”,“指数”)- >checkResponseElement(“身体”,“! / signin /”)- >checkResponseElement(“身体”,“signout /”);}公共函数signout(){返回这个美元- >得到(“/ user / signout”)- >isRequestParameter(“模块”,“用户”)- >isRequestParameter(“行动”,“signout”)- >isRedirected()- >followRedirect()- >isStatusCode(200年)- >isRequestParameter(“模块”,“产品”)- >isRequestParameter(“行动”,“指数”)- >checkResponseElement(“身体”,“signin /”)- >checkResponseElement(“身体”,“! / signout /”);}}
这是一个简单的测试,只有登录然后签署:
包括(目录名(__FILE__)。“/ . . / . . /引导/ functional.php”);/ /初始化数据库与夹具databaseManager美元=新sfDatabaseManager(美元配置);美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_data_dir”)。/设备的);美元的浏览器=新StoreBrowser();美元的浏览器- >signin()- >/ /登录时做些什么signout();
今天就到这儿了。我们现在支持的测试套件,文斯重构会话期间会很舒服。
帮助Symfony欧宝娱乐app下载地址项目!
与任何开源项目一样,< a href ="//www.oldmanjams.com/doc/current/contributing.html">贡献代码或文档来帮助欧宝体育电话是最常见的方式,但我们也有一个广泛的< a href ="//www.oldmanjams.com/sponsor">赞助机会。
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
是的,Sensio赞助提供培训测试(如果你有兴趣,给我发邮件)。
我爱这部分。
本系列文章真的是一个好主意!
这是Symfony的教程对我来说最好的选择。欧宝娱乐app下载地址
请在结束的第五把这个项目的源代码之前和之后的重构。
signin函数需要一个用户名和密码字符串作为参数,包括中间的代码类似:
setField(用户名,用户名美元)- >
setField(密码,密码)美元- >
点击(“登录”)- >