如何在功能测试中模拟HTTP认证
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何在功能测试中模拟HTTP认证
在功能测试中验证请求会降低整个测试套件的速度。这可能会成为一个问题,特别是当测试重现用户进行身份验证时所遵循的相同步骤时,例如提交登录表单或使用OAuth身份验证服务。
本文将介绍两种最流行的技术,以避免这些问题并在使用身份验证时创建快速测试。
仅对测试使用更快的身份验证机制
当您的应用程序使用form_login
身份验证,您可以通过允许测试使用HTTP身份验证来加快测试速度。这样,您的测试使用简单快速的HTTP Basic方法进行身份验证,而您的实际用户仍然通过正常的登录表单登录。
诀窍是使用http_basic
应用程序防火墙中的身份验证,但仅在测试使用的配置文件中:
- YAML
- XML
- PHP
1 2 3 4 5 6
# app / config / config_test.yml安全:防火墙:#将'main'替换为您自己防火墙的名称主要:http_basic:~
1 2 3 4 5 6 7
<!——app/config/config_test.xml——> . txt<安全:配置><!—将“main”替换为您自己防火墙的名称—><安全:防火墙的名字=“主要”><安全:http基本/>安全:防火墙>安全:配置>
1 2 3 4 5 6 7 8 9
/ / app / config / config_test.php$容器->loadFromExtension (“安全”,数组(“防火墙”= >数组(//将'main'替换为您自己的防火墙的名称“主要”= >数组(“http_basic”= >数组(),),),));
的第二个参数将用户名和密码作为服务器变量传递给HTTP,测试现在可以通过HTTP进行身份验证createClient ()
:
1 2 3 4
$客户端=静态::createClient (数组(),数组(“PHP_AUTH_USER”= >“用户名”,“PHP_AUTH_PW”= >“爸爸$ $词”));
用户名和密码也可以根据每个请求传递:
1 2 3 4
$客户端->请求(“删除”,' / post / 12,数组(),数组(),数组(“PHP_AUTH_USER”= >“用户名”,“PHP_AUTH_PW”= >“爸爸$ $词”));
创建认证令牌
如果应用程序使用更高级的身份验证机制,则不能使用前面的技巧,但仍然可以使测试更快。现在的诀窍是绕过身份验证过程,创建身份验证令牌并将其存储在会话中。
这种技术需要一些安全组件内部知识,但下面的示例显示了一个完整的示例,您可以根据自己的需要进行调整:
12 34 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
/ / src / AppBundle /测试/控制器/ DefaultControllerTest.php名称空间AppBundle\测试\控制器;使用ob娱乐下载\包\FrameworkBundle\测试\WebTestCase;使用ob娱乐下载\组件\BrowserKit\饼干;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\UsernamePasswordToken;类DefaultControllerTest扩展WebTestCase{私人$客户端=零;公共函数设置(){$这->客户=静态::createClient ();}公共函数testSecuredHello(){$这->登录();$履带=$这->客户端->请求(“得到”,“/管理”);$这->assertSame(响应::并,$这->客户端->getResponse ()->getStatusCode ());$这->assertSame (“管理仪表板”,$履带->过滤器(“标题”)->text ());}私人函数登录(){$会话=$这->客户端->getContainer ()->get (“会话”);$firewallName=“secure_area”;//如果您没有定义多个连接的防火墙,则上下文默认为防火墙名称//见https://symfob娱乐下载ony.com/doc/current/reference/configuration/security.html#firewall-context$firewallContext=“secured_area”;//你可能需要使用不同的令牌类,这取决于你的应用程序。//例如,当使用Guard认证时,必须实例化PostAuthenticationGuardToken$令牌=新UsernamePasswordToken (“管理”,零,$firewallName,数组(“ROLE_ADMIN”));$会话->集(“_security_”.$firewallContext序列化($令牌));$会话->save ();$饼干=新饼干($会话->getName (),$会话->getId ());$这->客户端->getCookieJar ()->集($饼干);}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。