TDD:如何测试搜索?

tho*_*hom 8 php testing tdd phpunit redgreen

我的网站将有一个高级搜索.人们可以去那里寻找一个权利(例如汽车).我已经创建了一些测试,根据搜索参数检查结果的数量.我想我应该写什么测试,然后我写它,然后我将数据添加到测试数据库.但问题来了.当我向数据库插入新值时,我的旧测试会中断.那是因为我正在检查记录的数量......

<?php defined('SYSPATH') or die('No direct access allowed!');

class Search_Test extends PHPUnit_Extensions_Database_TestCase
{
    /**
     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
     */
    public function getConnection()
    {
        $pdo = new PDO('mysql:dbname=db_test;host=127.0.0.1', 'root', null);
        return $this->createDefaultDBConnection($pdo, 'db_test');
    }

    /**
     * @return PHPUnit_Extensions_Database_DataSet_IDataSet
     */
    public function getDataSet()
    {
        $fixture = realpath(dirname(__FILE__).'/../data/fixture.xml');
        return $this->createXMLDataSet($fixture);
    }

    public function numberOfResultsDataProvider()
    {
        return array(
            array(1, null, null, 1),
            array(2, null, null, 3),
            array(3, null, null, 0),
            array('abc', null, null, 5),
            array(null, 1996, 2003, 3),
            array(null, 1996, 1999, 2),
            array(null, 2002, 2003, 1),
            array(null, 1500, 1800, 0),
            array(null, 2003, 2003, 1),
            array(null, null, 2005, 4),
            array(null, 1996, null, 4),
            array(null, null, null, 4),
            array(null, 2003, 1996, 0),
            array(null, 'abc', 2003, 4),
            array(null, '1996', '1999', 2),
            array(2, 2003, 2005, 2),
            array(null, null, null, 4),
        );
    }

    /**
     * @dataProvider numberOfResultsDataProvider
     */
    public function testNumberOfResults($brandId, $startYear, 
        $endYear, $numberOfResults
    ) {
        $search = ORM::factory('search');
        $search->setBrand($brandId)
            ->setYearRange($startYear, $endYear);
        $results = $search->results();
        $this->assertEquals($results->count(), $numberOfResults);
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

这是正常的吗?当我创建新测试时,我的旧测试是否会中断?

我的测试应该与数据有关吗?

我的搜索有太多参数,它们将以相同的形式使用(视图).我应该创建搜索每个参数的测试,还是应该一起测试?我应该把它拆分成更多的测试类吗?

谢谢.

Sin*_*ion 6

在进行涉及数据库的单元测试时,测试应该提供它将测试的实际数据库.它可能只是一个简单的数据库,只包含与测试相关的值,例如一行匹配,一行不匹配.对于在特定时间点存在的实时数据库的快照构建一堆测试也是合理的.

实现这一目标的一种特别方便的方法是向我们提供专门用于测试的Sqlite3数据库,并将您的应用程序设置为用于测试.