使用 Show Slow 存储自动 YSlow 测试
前几天,我在曼彻斯特网络性能小组的一次会议上,汤姆·泰勒(TomTaylor)谈到了他在Laterooms.com上使用的一些性能测试工具。他使用ruby脚本在Firefox中设置了一些首选项,然后运行Selenium打开一些网页并使用YSlow进行测试。然后将YSlow检查的结果发送到ShowSlow服务器,在那里可以将结果随时间绘制成图表。我意识到我刚刚在那里提到了一整套技术,所以让我挑出重要的:
Selenium是Web浏览器的远程控制代理,尽管它在Firefox中最稳定。我之前写过关于这个工具的文章,但它允许我们通过一系列selenium脚本自动与网站交互。这些脚本可以导出为不同的代码格式,包括PHP。
YSlow是Yahoo创建的Firebug插件,它试图根据一组性能标准对站点进行评分。这些是诸如HTML的结构方式以及发出的HTTP请求数之类的内容。
ShowSlow是一个PHP工具,它接受来自YSlow的参数并将它们存储在数据库中。这些结果被绘制和总结,允许随着时间的推移检查显示慢结果。它无法直接向其添加数据,而是通过API完成的。在www.showslow.com上有一项面向公众的服务,您可以在其中查看其他网站的结果。
YSlow测试的这种自动化让我开始思考如何使用PHPUnit来处理Selenium测试来实现这一点。我需要做的就是打开Firefox并将其配置为使用YSlow自动检查给定页面,然后再将结果发布到ShowSlow。
首先,我必须安装ShowSlow。这是一个非常简单的过程,但可能需要一个基于LAMP的系统才能正常工作。ShowSlow站点上有更多关于如何安装软件的说明。几分钟后,我的网络上有了一个ShowServer,我可以将YSlow数据发送到它。
在浏览了PHPUnitSelenium扩展源代码之后,我意识到我需要从不同的角度来处理它。没有什么可以让我从PHPUnit中配置Firefox。该解决方案随Firefox配置文件一起提供。事实证明,您可以让Firefox使用不同的配置文件实例加载自己,该实例将包含一组不同的插件和配置选项。这可以通过打开终端任意输入来完成:
firefox-ProfileManager-no-remote
Windows用户需要使用firefox.exe,OSx用户可能需要绝对引用Firefox应用程序。
这将打开一个窗口,您可以在其中管理Firefox扩展。只需创建一个新的并将其保存到特定目录并记住您放入的路径即可。
这将打开一个默认版本的Firefox,不包含任何扩展,并且所有配置选项都设置为默认值。第一步是安装Firebug和YSlow,以便您真正拥有运行测试所需的工具。
接下来,您需要配置Firebug和YSlow以自动运行页面上的测试并将结果发送到您的ShowSlow服务器。转到Firefoxabout:config页面(在地址栏中输入about:config)并更改一些选项。
首先,我们需要设置YSlow指标以将测试结果推送到ShowSlow。
extensions.yslow.beaconUrl = http://my.showslow.server.com/beacon/yslow/ extensions.yslow.beaconInfo = basic,grade,stats extensions.yslow.optinBeacon = true
我们还需要YSlow在页面加载时自动运行。
extensions.yslow.autorun=true
还有一些Firebug选项可以设置。我们需要做的是确保加载Firebug并且在加载Firebug时显示YSlow窗格。如果页面加载时YSlow未显示在屏幕上,则测试将不会运行,因此这很重要。
extensions.firebug.addonBarOpened = true extensions.firebug.allPagesActivation = on extensions.firebug.defaultPanelName = YSlow
完成后,您可以关闭Firefox。您可以选择禁用一些其他功能,例如内置拼写检查器,因为它们并不是真正需要的,并且会加快启动Firefox所需的时间。
现在我们需要以与往常相同的方式运行Selenium服务器,但在这里我们使用-firefoxProfileTemplate参数输入我们之前创建的Firefox模板。如果您使用的是Windows,那么您可能需要用双引号将参数括起来。
java-jarselenium-server-standalone-2.24.1.jar-firefoxProfileTemplate/path/to/selenium/firefox_profile
当您使用这个Selenium服务器时,您将使用创建的配置文件加载Firefox,在每个页面请求上有效地运行YSlow。我们现在要做的就是通过创建一些PHPUnit测试将它们联系在一起。这些测试不需要很复杂,我们所做的只是加载网页并让YSlow发布它必须显示慢的结果。如果您愿意,您可以在此测试中做其他事情,但在最后添加一些时间很重要,以便YSlow正确完成所有测试并发送结果。如果你不把这个时间放进去,你的测试很可能不会产生任何输出。
setBrowser("firefox"); $this->setBrowserUrl("http://www.hashbangcode.com/"); } public function testMyTestCase() { $this->open("/"); sleep(10); } }
您可以按照通常使用PHPUnit运行单元测试的相同方式运行它。您还可以通过包含对takeScreenshot()方法的调用来截取正在测试的页面的屏幕截图。在完成之前需要设置$screenshotPath和$screenshotUrl变量,但这是查看事情是否按预期工作的好方法。
public function testMyTestCase() { $path = '/'; $this->open($path); $this->screenshotPath = __DIR__; $this->screenshotUrl = $path; $this->takeScreenshot(); sleep(10); }
构建测试的最佳方法是为每个站点创建一个单独的测试类,其中可能包含多个页面检查。如果您将每个文件名以“Test.php”结尾,然后将该目录传递给PHPUnit命令,您就可以在PHPUnit中运行一个包含测试类的目录。这意味着所有Selenium/YSlow测试都可以通过cron作业或通过像Jenkins这样的CI服务器以自动化方式同时运行。