15天:单元测试
以前在symfonyob娱乐下载
现在的问题是组织良好的使用网站,由于社区,我们添加了标签功能欧宝体育平台怎么样昨天。
但有一件事,没有描述到目前为止,尽管它的重要性的web应用程序。单元测试是最大的进步之一从面向对象编程。他们允许安全的开发过程,重构而不用担心,有时可以代替文档,因为他们很清楚地说明了一个应用程序应该做什么。欧宝官网下载appob娱乐下载Symfony支持和建议的单元测试,并提供了工具。这些工具的概述,以及添加一些使用单元测试——今天将需要大量的时间。
简单的测试
有许多单元测试框架在PHP世界,主要是基于Junit。我们没有开发另一个symfony,而是我们最成熟的集成,ob娱乐下载简单的测试。它是稳定的,良好的文档记录,并提供大量的功能为所有PHP项目的价值,包括symfony的。ob娱乐下载如果你不知道它已经,强烈建议您浏览它们欧宝官网下载app,这是非常清晰和进步。
简单的测试不是捆绑symfony,但很简单的安装。ob娱乐下载首先,下载简单的测试梨可安装档案SourceForge。通过pear安装它通过调用:
pear安装simpletest_1.0.0.tgz美元
如果你想写一个批处理脚本,使用简单的测试库,所有你需要做的就是在剪贴薄中放入这些几行代码的脚本:
< ? phprequire_once(“simpletest / unit_tester.php”);require_once(“simpletest / reporter.php”);? >
ob娱乐下载Symfony它如果你使用测试命令行;我们很快就会讨论它。
请注意
由于PHP 5.0.5不向后兼容的改变,简单的测试目前不工作如果你有一个PHP版本高于5.0.4。这应该改变不久(一个alpha版本可以解决这个问题),但不幸的是本教程的其余部分将可能不工作之后如果你有一个版本。
单元测试在symfony项目ob娱乐下载
默认的单元测试
每一个syob娱乐下载mfony项目测试/
目录,分为应用程序目录。使用,如果你浏览到使用/测试/功能/前端
目录,你会发现一些文件已经存在:
answerActionsTest。php feedActionsTest。php mailActionsTest。php sidebarActionsTest。php userActionsTest.php
他们都包含相同的初始代码:
< ? php类answerActionsWebBrowserTest扩展UnitTestCase{私人美元的浏览器=零;公共函数设置(){/ /创建一个新的测试浏览器这个美元- >浏览器=新sfTestBrowser();这个美元- >浏览器- >初始化(的主机名);}公共函数拆卸(){这个美元- >浏览器- >关闭();}公共函数test_simple(){$ url=“回答/指数”;美元的html=这个美元- >浏览器- >得到($ url);这个美元- >assertWantedPattern(的答案/,美元的html);}}? >
的UnitTestCase
类的核心类是简单的测试单元测试。的设置()
方法是运行在每个测试方法之前,和tearDown ()
是运行在每个测试方法。实际测试方法从“测试”这个词。检查如果一段代码表现像您预期的那样,您使用断言,这是一个方法调用,验证是正确的。首先在简单的测试中,断言断言
。在这个例子中,一个单元测试实现,它看起来的“用户”这个词的默认页面模块。这个自动生成文件对你来说是一个存根。
事实上,每次你打电话ob娱乐下载symfony init-module
,sob娱乐下载ymfony创建一个这样的框架测试/(浏览器名称)
目录存储相关的单元测试创建的模块。麻烦的是,一旦你修改默认模板,存根测试不通过了(他们检查默认页面的标题,“模块modulename美元”)。所以现在,我们将删除这些文件和工作在自己的测试用例。
添加一个单元测试
在天13,我们创建了一个Tag.class.php
与两个函数用于标记文件操作。我们将为我们的标记库添加一些单元测试。
创建一个TagTest.php
文件(所有测试用例文件必须结束测试
简单的测试来发现他们):
< ? phprequire_once(“Tag.class.php”);类TagTest扩展UnitTestCase{公共函数test_normalize(){美元的测试=数组(“FOO”= >“foo”,“foo”= >“foo”,“foo”= >“foo”,“foo”= >“foo”,“foo bar”= >“foobar”,);foreach(美元的测试作为美元的标记= >normalized_tag美元){这个美元- >assertEqual(normalized_tag美元标签::正常化(美元的标记));}}}? >
第一个测试用例,我们将实现问题标签:正常()
方法。单元测试要测试一个案例中,我们预期的结果文本的方法分解成基本情况。我们知道标签:正常()
方法应该返回一个小写版本的论点,没有任何空间,论点之前或之后,没有任何特殊字符。5中定义的测试用例美元的测试
数组足以测试。
为每个基本测试用例,然后我们比较的标准化版本输入和预期的结果,调用- > assertEqual ()
方法。这是一个单元测试的核心。如果失败了,测试用例的名称将测试套件运行时的输出。如果通过,它只会通过测试的数量。
我们可以用这个词添加最后一个测试“foo bar”
,但它和基本情况。如果测试失败,你不会有一个清晰的概念的精确原因问题,你将需要进一步调查。保持基本情况给你错误的保险将会更容易找到。
请注意
广泛的列表断言
方法中可以找到简单的测试文档欧宝官网下载app。
运行单元测试
symfob娱乐下载ony命令行可以运行所有的测试用一个命令(记得要叫它从你的项目根目录):
美元ob娱乐下载symfony test-functional前端
调用这个命令执行的所有测试测试/功能/前端/
目录,现在只有我们的新TagTest.php
集。这些测试将通过和命令行显示:
syob娱乐下载mfony test-functional前端测试套件美元(测试/前端)好的测试用例运行:1/1,经过:5,失败:0,例外:0
请注意
测试发起的symfony命令行不需要包括简单ob娱乐下载的测试库(unit_tester.php
和reporter.php
包括自动)。
反过来
单元测试的最大的好处是有经验的时候做的测试驱动开发。在这个方法中,测试之前编写的函数。
在上面的示例中,您将编写一个空的标签:正常()
方法,然后编写第一个测试用例(“Foo”/“Foo”),然后运行测试套件。测试会失败。您将添加必要的代码来将参数转换为小写并返回它标签:正常()
方法,然后再次运行测试。这次考试能通过。
所以你会为空白添加测试,运行它们,看到他们失败,添加的代码删除空白,再次运行测试,发现他们通过。然后做同样的特殊字符。
先编写测试帮助你关注的事情一个函数在实际开发之前应该做的。这是一个很好的实践,其他方法,比如极限编程,推荐。此外,它考虑了不可否认的事实,如果你不先编写单元测试,你永远不会写。
最后一个建议:让你的单元测试像这里所描述的那样简单。构建应用程序和一个测试驱动方法大致结束了测试代码和实际代码一样多,所以你不想花时间调试测试用例…
当一个测试失败
现在我们将测试添加到检查的第二种方法标签
对象,它将一个字符串的一些标记为一个数组的标签。添加以下方法TagTest
类:
公共函数test_splitPhrase(){美元的测试=数组(“foo”= >数组(“foo”),“foo酒吧”= >数组(“foo”,“酒吧”),“foo酒吧”= >数组(“foo”,“酒吧”),““foo酒吧”使用”= >数组(“foo酒吧”,“使用”),“foo酒吧使用”= >数组(“foo酒吧”,“使用”),);foreach(美元的测试作为美元的标记= >美元的标记){这个美元- >assertEqual(美元的标记标签::splitPhrase(美元的标记));}}
请注意
作为一个良好的实践,我们建议测试文件的类名他们应该测试和测试用例的方法他们应该测试。你的测试/
目录将包含大量的文件,并找到一个测试可能是艰难的从长远来看,如果你不。
如果您尝试再次运行测试,他们失败:
美元ob娱乐下载symfony test-functional前端测试套件(测试/前端)1)等于预期失败的关键[0,1]列表不匹配键列表(0,1,2)行[35]在test_splitPhrase TagTest /home/production/askeet/test/functional/frontend/TagTest.php失败! ! !通过测试用例运行:1/1:9日失败:1,例外:0
的一个测试用例test_splitPhrase
失败。找到哪一个是,你需要删除它们在次看到当测试通过。这一次,这是最后一个,当我们测试的处理简单报价。当前的标签:splitPhrase ()
方法将这个字符串不正常。作为作业的一部分,你必须正确的明天。
这说明这样一个事实,如果你堆积太多的基本测试用例的一个数组,一个失败是难以定位。总是喜欢把长测试用例分离到方法,从简单的测试提到的方法的名称,一个测试失败。
模拟一个web浏览器会话
Web应用程序不都或多或少像功能的对象。页面请求的复杂机制,HTML结果与浏览器交互需要多的暴露前建立一套完整的单元测试一个symfony的web应用程序。ob娱乐下载
我们将讨论三种不同的方式来实现一个简单的web应用程序测试。测试是一个请求对第一个问题的细节,并假设一些文本的答案是礼物。我们将把这个测试到QuestionTest.php
文件,位于使用/测试/功能/前端
目录中。
的sfTestBrowser
对象
ob娱乐下载Symfony提供了一个对象sfTestBrowser
,它允许模拟没有浏览器和浏览,更重要的是,没有一个web服务器。是在框架允许这个对象完全绕过http传输层。这意味着浏览的模拟sfTestBrowser
快,和独立服务器的配置,因为它不使用它。
让我们看看如何与这个对象请求一个页面:
美元的浏览器=新sfTestBrowser();美元的浏览器- >初始化();美元的html=美元的浏览器- >得到(“uri”);/ /在html美元做一些测试美元的浏览器- >关闭();
的get ()
需要路由请求URI作为参数(不是一个内部URI),并返回一个原始HTML页面(一个字符串)。你可以在这个页面进行各种测试,使用断言* ()
的方法UnitTestCase
对象。
您可以将参数传递给你的电话,你会在你的浏览器地址栏:
$ html浏览器= $ - > get (' / frontend_test.php /问题/ what-can-i-offer-to-my-stepmother ');
我们使用一个特定的原因前端控制器(frontend_test.php
)将在下一节中解释。
的sfTestBrowser
模拟一个cookie。这意味着只有一个sfTestBrowser
对象,您可以需要几页一个接一个,他们将被视为单个会话的一部分的框架。此外,这一事实sfTestBrowser
使用uri uri而不是内部路由路由引擎允许您测试。
实现我们的web测试,test_QuestionShow ()
方法必须建立如下:
< ? php类QuestionTest扩展UnitTestCase{公共函数test_QuestionShow(){美元的浏览器=新sfTestBrowser();美元的浏览器- >初始化();美元的html=美元的浏览器- >得到(“frontend_test.php /问题/ what-can-i-offer-to-my-step-mother”);这个美元- >assertWantedPattern(/我的继母拥有一切的继母通常是提供/ ',美元的html);美元的浏览器- >关闭();}}
因为几乎所有的网络单元测试将需要一个新的sfTestBrowser
初始化和关闭测试后,你最好的部分代码- >设置()
和- > tearDown ()
方法:
< ? php类QuestionTest扩展UnitTestCase{私人美元的浏览器=零;公共函数设置(){这个美元- >浏览器=新sfTestBrowser();这个美元- >浏览器- >初始化();}公共函数拆卸(){这个美元- >浏览器- >关闭();}公共函数test_QuestionShow(){美元的html=这个美元- >浏览器- >得到(“frontend_test.php /问题/ what-can-i-offer-to-my-step-mother”);这个美元- >assertWantedPattern(/我的继母拥有一切的继母通常是提供/ ',美元的html);}}
现在,每一个新测试
方法,您添加清洁sfTestBrowser
对象开始。你可能认识这里的自动生成的测试用例开始提到的这个教程。
的WebTestCase
对象
附带一个简单的测试WebTestCase
类,包括导航设施、内容和cookie检查,并形成处理。测试扩展这个类允许您浏览会话模拟http传输层。再一次,简单的测试文档欧宝官网下载app详细解释了如何使用这个类。
测试了WebTestCase
比那些更慢了sfTestBrowser
,因为web服务器的每一个要求。他们还要求你有一个工作的web服务器配置。然而,WebTestCase
对象提供了众多的导航方法断言* ()
的人。通过使用这些方法,可以模拟复杂的浏览会话。的一个子集WebTestCase
导航方法:
- - - - - - | - - - - - - | - - - - - - |
---|---|---|
get (url参数)美元 |
setField(名字,美元价值) |
验证(名称、密码)美元 |
帖子(url,美元参数) |
clickSubmit(标签) |
重启() |
回() |
clickImage(标签,x美元,$ y) |
getCookie(名称) |
转发() |
clickLink(标签,美元指数) |
ageCookies(间隔) |
我们可以很容易地做同样的测试用例作为以前WebTestCase
。注意,您现在需要输入完整的uri,因为他们将请求到web服务器:
require_once(“simpletest / web_tester.php”);类QuestionTest扩展WebTestCase{公共函数test_QuestionShow(){这个美元- >得到(“http://askeet/frontend_test.php/question/what-can-i-offer-to-my-step-mother”);这个美元- >assertWantedPattern(/我的继母拥有一切的继母通常是提供/ ');}}
这个对象的其他方法可以帮助我们测试如何处理提交表单,例如单元测试登录过程:
公共函数test_QuestionAdd(){这个美元- >得到(“http://askeet/frontend_dev.php/”);这个美元- >assertLink(“登录/注册”);这个美元- >clickLink(“登录/注册”);这个美元- >assertWantedPattern(的绰号:/);这个美元- >setField(“昵称”,“fabpot”);这个美元- >setField(“密码”,sob娱乐下载ymfony的);这个美元- >clickSubmit(“登录”);这个美元- >assertWantedPattern(“/ fabpot概要”);}
很方便的可以为字段设置一个值,你会做手工提交表单。如果你不得不通过模拟帖子
请求被调用(这是可能的- > post (uri,美元参数)
),你必须写在测试函数的目标行动和隐藏字段,因此过于依赖实现。与简单的测试形式测试的更多信息,阅读相关章节简单的测试文档。欧宝官网下载app
硒
的主要缺点sfTestBrowser
和WebTestCase
测试,他们不能模拟JavaScript。使用AJAX交互等非常复杂的相互作用,例如,你需要能够准确地重现用户的鼠标和键盘输入。通常,这些测试是手工复制的,但他们非常耗时且容易出错。
的解决方案,这一次,来自世界的JavaScript。它被称为硒更好的使用时硒记录仪为Firefox扩展。Selenium执行的一组操作在一个页面上就像一个普通用户,使用当前的浏览器窗口。
硒与symfony默认绑定。ob娱乐下载要安装它,您需要创建一个新的硒/
目录在你的web /
目录,并解压缩的内容硒存档。这是因为硒依赖于JavaScript,大多数浏览器的安全设置标准不允许它运行,除非它是可用的应用程序相同的主机和端口。
请注意
当心不要转移硒/
目录到您的生产主机,因为这将从外部访问。
Selenium测试都写在HTML和存储硒/测试/
目录中。例如,对问题做简单的单元测试的细节,请创建以下文件testQuestion.html
:
< !DOCTYPE html公共”——/ / W3C / / DTD HTML 4.01过渡/ / EN”> < html > = <头> < meta内容“text / html;charset = utf - 8”http-equiv =“内容类型”> <标题>问题测试< /名称> < /头> <身体> <表格单元格间距=“0”tbody > > < < tr > < td colspan =“3”> < / td的第一步> < / tr > < tr > < td > < / td > < td > / frontend_test开放。php/clickAndWait link=What can I offer to my step mother? assertTextPresent My stepmother has everything a stepmother is usually offered