测试
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.2,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
测试
每当你写新代码,你也可能添加新的bug。建立更好、更可靠的应用程序时,您应该使用功能和测试您的代码单元测试。
PHPUnit)测试框架
欧宝娱乐app下载地址Symfony集成了一个独立的库PHPUnit)给你一个丰富的测试框架。本文不会讨论PHPUnit)本身,都有自己的优秀欧宝体育电话。
创建您的第一个测试之前,安装PHPUnit)桥接组件,来包装原始PHPUnit)二进制提供额外的功能:
1
美元作曲家要求- dev symfony / ph欧宝娱乐app下载地址punit-bridge
每个测试——无论它是一个单元测试或功能测试——是一个PHP类,应该生活在测试/
应用程序的目录。如果你遵循这个规则,你就可以运行您的应用程序的所有测试使用下面的命令:
1
美元/ bin / phpunit)
请注意
的/ bin / phpunit)
命令是由欧宝娱乐app下载地址Symfony Flex在安装的时phpunit-bridge
包中。如果命令丢失,你可以把包(作曲家删除symfony / p欧宝娱乐app下载地址hpunit-bridge
)并安装一遍。另一个解决办法是删除项目欧宝娱乐app下载地址symfony.lock
文件和运行作曲家安装
强制执行的Symfony Flex食谱。欧宝娱乐app下载地址
PHPUnit)的配置phpunit.xml.dist
Symfony应用程序文件的根。欧宝娱乐app下载地址
提示
代码覆盖率可以与生成——覆盖- *
选项,查看帮助信息显示在使用中——帮助
为更多的信息。
单元测试
单元测试是一种测试一个PHP类,也称为单位。如果你想测试您的应用程序的整体行为,看到的部分功能测试。
写作Symfon欧宝娱乐app下载地址y的单元测试与写作标准PHPUnit)单元测试。例如,假设你有一个令人难以置信的简单的类称为计算器
在src / Util /
应用程序的目录:
1 2 3 4 5 6 7 8 9 10
/ / src / Util / Calculator.php名称空间应用程序\跑龙套;类计算器{公共函数添加(美元一个,美元b){返回美元一个+美元b;}}
为了验证这一点,创建一个CalculatorTest
文件测试/ Util
您的应用程序的目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /测试/ Util / CalculatorTest.php名称空间应用程序\测试\跑龙套;使用应用程序\跑龙套\计算器;使用PHPUnit)\框架\TestCase;类CalculatorTest扩展TestCase{公共函数testAdd(){美元计算器=新计算器();美元结果=美元计算器- >add (30.,12);/ /正确断言计算器添加数字!美元这- >assertequal (42,美元结果);}}
请注意
按照惯例,测试/
目录应该复制目录为单元测试你的包。所以,如果你正在测试一个类src / Util /
目录,把测试测试/ Util /
目录中。
就像在真实的应用程序——半自动的是自动启用通过供应商/ autoload.php
配置文件(默认情况下phpunit.xml.dist
文件)。
你也可以限制测试运行一个目录或一个特定的测试文件:
1 2 3 4 5 6 7 8
#运行所有的测试应用程序美元php bin / phpunit)# Util /目录中运行所有测试美元php bin / / Util phpunit)测试#为计算器类运行测试美元php bin / / Util / CalculatorTest.php phpunit)测试
功能测试
功能测试检查应用程序的不同层的集成(从路由视图)。他们没有不同于单元测试PHPUnit)而言,但他们有一个非常具体的工作流程:
- 使一个请求;
- 点击一个链接或提交表单;
- 测试的响应;
- 清洗和重复的方法。
创建您的第一个测试之前,安装这些包提供了一些实用程序用于功能测试:
1
美元作曲家要求- dev symfony / br欧宝娱乐app下载地址owser-kit symfony / css选择器
你的第一个功能测试
功能测试通常生活在PHP文件测试/控制器
目录你的包。如果你想测试页面由你处理为PostController
类,通过创建一个新的开始PostControllerTest.php
扩展了一个特殊的文件WebTestCase
类。
作为一个例子,一个测试可以是这个样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /测试/控制器/ PostControllerTest.php名称空间应用程序\测试\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\测试\WebTestCase;类PostControllerTest扩展WebTestCase{公共函数testShowPost(){美元客户端=静态::createClient ();美元客户端- >请求(“得到”,' / post / hello world ');美元这- >assertequal (200年,美元客户端- >getResponse ()- >getStatusCode ());}}
提示
运行功能测试,WebTestCase
类需要知道哪些是应用程序内核引导它。内核中定义的类通常是KERNEL_CLASS
环境变量(包含在默认.env.test
Symfony提供的文件):欧宝娱乐app下载地址
如果你的用例是更复杂,你还可以覆盖createKernel ()
或getKernelClass ()
功能测试的方法,它优先于KERNEL_CLASS
env var。
在上面的例子中,HTTP响应验证是成功的。下一步就是验证页面实际上包含预期的内容。的createClient ()
方法返回一个客户,就像一个浏览器,您将使用爬行你的网站:
1
美元履带=美元客户端- >请求(“得到”,' / post / hello world ');
的请求()
方法(读更多关于请求方法)返回一个履带对象可用于响应中选择元素,单击链接并提交表单。
提示
的履带
只能当响应是一个XML或HTML文档。原始内容响应,电话客户端- > getResponse美元()- > getContent ()
。
爬虫的集成欧宝娱乐app下载地址symfony / css选择器
CSS选择器组件的力量给你找到一个页面中的内容。安装CSS选择器组件,运行:
1
美元作曲家要求- dev symfony / cs欧宝娱乐app下载地址s选择器
现在您可以使用CSS选择器与履带。断言“Hello World”这个词是在页面上至少一次,您可以使用此断言:
1 2 3 4
美元这- >assertGreaterThan (0,美元履带- >过滤器(html:包含(“Hello World”)”)- >count ());
爬虫也可以用来与页面交互。点击一个链接,首先选择它的履带使用XPath表达式或一个CSS选择器,然后使用客户端点击:
1 2 3 4 5 6 7 8
美元链接=美元履带- >过滤器(答:包含(“问候”)的)/ /查找所有与文本“问候”- >eq (1)/ /列表中选择第二个链接- >链接();/ /点击它美元履带=美元客户端- >点击(美元链接);
提交表单非常相似:选择一个表单按钮,选择覆盖一些表单值并提交相应的表单:
1 2 3 4 5 6 7 8
美元形式=美元履带- >selectButton (“提交”)- >形式();/ /设置一些值美元形式(“名字”]=“卢卡斯”;美元形式(“form_name(主题)”]=“嘿!”;/ /提交表单美元履带=美元客户端- >提交(美元形式);
提示
形式也可以处理上传和包含的方法填写(如不同类型的表单字段。select ()
和蜱虫()
)。详情,请参阅形式下面的部分。
现在你可以浏览应用程序,使用断言来测试它实际上您期望它。使用爬虫对DOM断言:
1 2
/ /断言响应匹配给定的CSS选择器。美元这- >assertGreaterThan (0,美元履带- >过滤器(“标题”)- >count ());
或直接测试响应的内容,如果你只是想断言的内容包含一些文本或的响应并不是一个XML / HTML文档:
1 2 3 4
美元这- >assertContains (“Hello World”,美元客户端- >getResponse ()- >getContent ());
提示
而不是单独安装每个测试的依赖,可以使用Symfony的测试包安装所有这些依赖项:欧宝娱乐app下载地址
1
美元作曲家需要- dev symfony /欧宝娱乐app下载地址测试包
有用的断言
开始更快,这里列出最常见的和有用的测试断言:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;/ /……/ /断言,至少有一个h2标签/ /类的“字幕”美元这- >assertGreaterThan (0,美元履带- >过滤器(“h2.subtitle”)- >count ());/ /断言,确切地说,有4 h2标签在页面上美元这- >assertCount (4,美元履带- >过滤器(“氢气”));/ /断言“内容类型”的标题是“application / json”美元这- >assertTrue (美元客户端- >getResponse ()- >头- >包含(“内容类型”,“application / json”),的“内容类型”头“application / json”/ /可选的消息显示在失败);/ /断言响应内容包含一个字符串美元这- >assertContains (“foo”,美元客户端- >getResponse ()- >getContent ());/ /……或matches a regex美元这- >assertRegExp (“/ foo (bar) ?”,美元客户端- >getResponse ()- >getContent ());/ /断言响应状态码是2 xx美元这- >assertTrue (美元客户端- >getResponse ()- >isSuccessful (),“响应状态是2 xx”);/ /断言响应状态码是404美元这- >assertTrue (美元客户端- >getResponse ()- >isNotFound ());/ /断言一个特定的200状态码美元这- >assertequal (200年,/ /或Sy欧宝娱乐app下载地址mfony \组件\ HttpFoundation \回应::并美元客户端- >getResponse ()- >getStatusCode ());/ /断言响应是一个重定向到/演示/接触美元这- >assertTrue (美元客户端- >getResponse ()- >isRedirect (“/演示/接触”)/ /如果重定向URL生成作为绝对URL/ /客户端- > getResponse () - > isRedirect (“http://localhost/demo/contact”));/ /……或simply check that the response is a redirect to any URL美元这- >assertTrue (美元客户端- >getResponse ()- >isRedirect ());
针对不同的数据的测试
通常需要执行相同的测试针对不同的数据检查代码必须处理多个条件。这是解决PHPUnit)的数据提供商,对单元测试和功能测试工作。
首先,将一个或多个参数添加到您的测试方法和测试代码中使用它们。然后,定义另一个方法返回一个嵌套数组的参数使用在每个测试运行。最后,添加@dataProvider
注释关联两种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ * * *@dataProviderprovideUrls * /公共函数testPageIsSuccessful(美元url){美元客户端=自我::createClient ();美元客户端- >请求(“得到”,美元url);美元这- >assertTrue (美元客户端- >getResponse ()- >isSuccessful ());}公共函数provideUrls(){返回[[' / ']、[“/博客”]、[' /接触'),/ /……];}
使用测试客户端
测试客户端模拟HTTP客户端浏览器和使请求Symfony应用程序:欧宝娱乐app下载地址
1
美元履带=美元客户端- >请求(“得到”,' / post / hello world ');
的请求()
方法使用HTTP方法和一个URL作为参数,并返回一个履带
实例。
提示
硬编码的请求url是功能测试的最佳实践。如果测试生成的url使用Symfony的路由器,它不会发现任何变化的可能影欧宝娱乐app下载地址响最终用户应用程序的url。
更多关于请求()
方法:
的完整签名请求()
方法是:
1 2 3 4 5 6 7 8 9
请求(美元方法,美元uri,数组美元参数= [],数组美元文件= [],数组美元服务器= [],美元内容=零,美元changeHistory=真正的)
的服务器
数组的原始值,你通常会发现在PHP$ _SERVERsuperglobal。例如,设置内容类型
和推荐人
HTTP头信息,你会通过以下(思维HTTP_
前缀为非标准头文件):
1 2 3 4 5 6 7 8 9 10
美元客户端- >请求(“得到”,' / post / hello world '[][],[“CONTENT_TYPE”= >“application / json”,“HTTP_REFERER”= >“/ foo / bar”]);
使用爬虫发现DOM元素的响应。这些元素可以用来点击链接,提交形式:
1 2 3
美元履带=美元客户端- >clickLink (“去别处……”);美元履带=美元客户端- >submitForm (“验证”,(“名字”= >“法”]);
的clickLink ()
和submitForm ()
方法都返回一个履带
对象。这些方法的最佳方式浏览您的应用程序,因为它对你负责很多事情,像检测形式的HTTP方法和给你一个很好的API来上传文件。
的请求()
方法也可以用来模拟直接或执行更复杂的表单提交请求。一些有用的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37
/ /提交表单直接(但使用履带容易!)美元客户端- >请求(“职位”,/提交的,(“名字”= >“法”]);/ /提交一个请求主体的原始JSON字符串美元客户端- >请求(“职位”,/提交的[][],[“CONTENT_TYPE”= >“application / json”),”{“名称”:“法”}’);/ /文件上传表单提交使用欧宝娱乐app下载地址\组件\HttpFoundation\文件\UploadedFile;美元照片=新UploadedFile (“/道路/ / photo.jpg”,“photo.jpg”,“图像/ jpeg”,零);美元客户端- >请求(“职位”,/提交的,(“名字”= >“法”]、[“照片”= >美元照片]);/ /执行删除请求并通过HTTP头美元客户端- >请求(“删除”,' / post / 12[][],[“PHP_AUTH_USER”= >“用户名”,“PHP_AUTH_PW”= >“爸爸$ $词”]);
最后但并非最不重要,你可以迫使每个请求执行的PHP程序来避免任何副作用在处理一些客户在相同的脚本:
1
美元客户端- >使();
AJAX请求
客户端提供了一个xmlHttpRequest ()方法,该方法具有相同的参数请求()
方法,这是一个捷径使AJAX请求:
1 2
/ /需要HTTP_X_REQUESTED_WITH头自动添加美元客户端- >xmlHttpRequest (“职位”,/提交的,(“名字”= >“法”]);
浏览
客户端支持许多操作,可以做在一个真正的浏览器:
1 2 3 4 5 6
美元客户端- >回();美元客户端- >转发();美元客户端- >重载();/ /清除所有饼干和历史美元客户端- >重启();
请注意
的回()
和转发()
方法跳过时可能发生的重定向请求URL,正常的浏览器。
访问内部对象
如果你使用客户端来测试您的应用程序,您可能希望访问客户的内部对象:
1 2
美元历史=美元客户端- >getHistory ();美元cookieJar=美元客户端- >getCookieJar ();
你也可以对象相关的最新要求:
1 2 3 4 5 6 7 8 9 10 11 12 13
/ / HttpKernel请求实例美元请求=美元客户端- >getRequest ();/ / BrowserKit请求实例美元请求=美元客户端- >getInternalRequest ();/ / HttpKernel响应实例美元响应=美元客户端- >getResponse ();/ / BrowserKit响应实例美元响应=美元客户端- >getInternalResponse ();美元履带=美元客户端- >getCrawler ();
访问容器
这是强烈建议功能测试只测试响应。但在某些非常罕见的情况下,您可能希望访问一些服务写断言。鉴于服务是私人在默认情况下,测试类定义一个属性存储Symfony创建的一个特殊的容器允许获取公共和所有non-removed私人服务:欧宝娱乐app下载地址
1 2 3
/ /给访问您的测试中使用的相同的服务,除非你使用/ / $客户- >隔离()或使用真正的HTTP请求来测试您的应用程序美元容器=自我::$容器;
在应用程序中可用的服务列表,使用调试:容器
命令。
提示
出获得私人服务的特殊容器只存在于测试
环境和本身就是一种服务,你可以得到真正的容器使用test.service_container
id。
提示
如果你需要检查的信息可以从分析器,用它代替。
访问性能分析数据
在每个请求,您可以使Symfony分析器收集数据的内部处理请求。欧宝娱乐app下载地址例如,分析器可以用来验证给定页面执行不到一定数量的加载时数据库查询。
分析器的最后的请求,执行以下操作:
1 2 3 4 5 6 7
/ /使分析器的下一个请求美元客户端- >enableProfiler ();美元履带=美元客户端- >请求(“得到”,' /分析器');/ /获取配置文件美元配置文件=美元客户端- >getProfile ();