jobeet第九天:功能测试

*这一系列文章来源于Fabien Potencier,基于Symfony1.4编写的Jobeet Tutirual

功能测试是一个很好的端到端(end to end)测试工具,端到端就是从浏览器发出请求并接受到服务器响应的过程。功能测试用于测试应用程序的所有层:路由(the routing)模型(the model)行为(the actions)模板(the templates)。功能测试和我们曾经手动做过的测试的原理是十分相似的:每次当我们为网站修改或者添加一个行为的的时候,我们会去浏览器中检查被渲染页面中的链接或者页面元素是否和我们预期的结果一致。也就是说,我们进行手动测试的目的其实就是为了模拟将来某一时刻用户使用这些功能时的情景,功能是否按照预期的结果正确运行。

因为手动测试的过程是乏味而且容易出错的。每次我们对代码进行了修改时,我们就必须对所有的情景一步步地进行调试以确保我们做的修改是正确的。这样繁复的手动测试简直会让人疯掉的。Symfony中的功能测试提供了一种简单的方式来描述(decribe)情景(scenarios),以此来进行功能测试。每个场景都能够一遍又一遍地再现模拟用户在浏览器中的操作。功能测试和单元测试一样,它能够让我们对编写好的代码更加有信心确保其正确性。

功能测试有一个明确的工作流:

  • 发出请求
  • 测试响应
  • 点击一个链接或者提交一个表单
  • 测试响应
  • Rinse and repeat

第一个功能测试

功能测试通常是一个存放在Tests/Controller目录下的一个PHP文件。如果我们想要测试被CategoryController类控制的页面,那么就需要创建CategoryControllerTest类,并让它继承WebTestCase类:

想要学些更多关于crawler的知识,你可以通过Symfony文档进行学习。

运行功能测试

和单元测试一样,我们可以通过PHPUnit命令来运行功能测试:

运行测试不能通过,因为测试的URL /category/indexJobeet中是无效的。

 

编写功能测试

编写功能测试就像是在浏览器中进行情景的模拟。我们在第二天的内容中已经把所有的场景都已经描述出来了,我们需要逐一地测试它们。

首先,我们来编辑JobControllerTest类来测试Jobeet的首页。我们会一个个地对这些功能进行测试:

不在有效期内的Job数据不应该被显示出来

为了验证过期的Job数据不能在首页中被显示出来,我们需要通过对服务器返回的HTML页面进行匹配,检查是否有能和css选择器.jobs td.position:contains(“Expired”)相匹配的HTML内容(还记得Fixtures吗?我们只在过期Job数据的position列中包含了“Expired”字符)。

一个Category只能显示N行Job

把下面的代码添加到testIndex()函数后面。为了在功能测试中得到app/config/config.yml中的自定义参数,我们会使用到内核(kernel):

为了能进行测试,我们需要为Job/index.html.twig中的每个Category添加适当的css class(这样做才能够选择出每个Category并计算被显示出的Job信息数量):

 

只有当Category中有过多的Job数据时才有and…more…

在这个测试中,我们检查design分类没有“more jobs”链接(即.category_design .more_jobs不存在),检查programming“more jobs”链接(即.category_design .more_jobs存在)。

Job列表按照日期排序

为了检查Job列表是否按照日期来排序,我们需要检查第一行的Job信息是否和我们所预期的一样。我们可以通过检查URL中是否包含有预期Job数据的主键来实现这个测试。主键可能在运行期间被改变,我们首先要从数据库中得到Doctrine对象。

即使测试只在测试阶段才运行,但是我们也同样需要对代码进行重构,比如像获得programming分类中的第一条Job数据的功能,使得这个功能在其它的地方也能够被重用。我们不会把这些代码移到Model层里,因为这些代码只用在编写测试中。相反地,我们会把代码放在测试类里的getMostRecentProgrammingJob()函数中:

现在用下面的代码替换之前的代码:

 

在首页中的每条Job信息都是可以链接的

为了测试首页中Job列表的链接,我们在“Web Developer”文本上进行模拟链接。首页中有很多的Job信息,我们指定要求浏览器点击第一条Job信息。

测试URL中的每个请求参数,以确保点击链接后的路由能够正确地工作。

 

学习例子

在这一部分中包含有测试JobCategory页面所需的代码。请仔细阅读代码,你也许能够从中学到一些小技巧:

 

今天我们就先到这啦,明天我们会讲解表单(forms),那么我们明天见!

 

原文链接:http://www.intelligentbee.com/blog/2013/08/15/symfony2-jobeet-day-9-the-functional-tests/

发表评论