测试

概言之,测试分为两种。单元测试(unit testing)让你能测试特定方法的输入和输出。功能测试(function testing)让你模拟一个浏览器来访问程序页面、点击链接、填充表单以及断言你在页面上看到的特定内容。

单元测试 

单元测试,被用来测试你的“业务逻辑”,它们是在你的类里,独立于Symfony之外。因此,Symfony对你选择何种单元测试工具并不发表意见。不过,最受欢迎的工具还是PhpUnitPhpSpec

功能测试 

创建一个良好的功能测试绝非易事,以至一些开发者完全略过了这里。请不要无视功能测试!通过定义一些简单的功能测试,在部署程序之前,你可以快速地找到一些重大错误:

Best Practice

定义一个功能测试,至少检查一下你的程序页面是否可以被成功加载。

一个功能测试可能如以下代码这般简单:

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
// tests/AppBundle/ApplicationAvailabilityFunctionalTest.php
namespace Tests\AppBundle;
 
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
 
class ApplicationAvailabilityFunctionalTest extends WebTestCase
{
    /**
     * @dataProvider urlProvider
     */
    public function testPageIsSuccessful($url)
    {
        $client = self::createClient();
        $client->request('GET', $url);
 
        $this->assertTrue($client->getResponse()->isSuccessful());
    }
 
    public function urlProvider()
    {
        return array(
            array('/'),
            array('/posts'),
            array('/post/fixture-post-1'),
            array('/blog/category/fixture-category'),
            array('/archives'),
            // ...
        );
    }
}

上述代码,检查了所有给定的URL被成功加载,这意味着HTTP响应的状态码(status code)应该是200299之间。看上去似乎没什么用,但却体现出只要做出一点点的努力,功能测试就可以值回你的程序票价。

在计算机软件领域,这种类型的测试被称为smoke test,由“一些初级测试,为的是揭示一些足以影响到未来软件推出的简单错误” 所构成。

在功能测试出写死URL 

有些人可能会问,为什么前面的测试,不去使用sf系统的URL generator服务来生成url呢?

Best Practice

在功能测试中,将URLs写死,而不要使用URL generator。

思考下面的功能测试代码,使用了router服务来生成测试页面的URL:

1
2
3
4
5
6
7
8
public function testBlogArchives()
{
    $client = self::createClient();
    $url = $client->getContainer()->get('router')->generate('blog_archives');
    $client->request('GET', $url);
 
    // ...
}

代码执行正确,但却有一个致命缺陷。如果某个开发者,错误地改变了blog_archives路由的路径,则测试仍将通过,但原始的(旧的)URL却不能用了!这意味着任何收藏了那个URL的书签都将失效,你也会失去引擎的page ranking。(译注:此处意思是说,测试中使用确定的链接,意味着链接是永远确定的,就算有人为地改变了路由的路径,功能测试也将立即发现这种“改变”并且报错,这样就不会带来灾难性的后果,比如影响到用户或失去pr)

测试JavaScript功能 

内置的功能测试client是很强大的,但却不能被用于页面中的js脚本测试。如果你需要测试js,请使用PHPUnit里面的Mint类库。

当然,如果你使用的是重载前端框架,你应该首选纯正的前端测试工具。

深入学习功能测试 

可以考虑使用HautelookAliceBundle来为你的测试fixtures生成“真实的”数据,这些fixtures(假数据)是通过FakerAlice来得到的。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)