php - TDD:如何测试搜索?

标签 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);
    }
}
?>

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

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

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

谢谢。

最佳答案

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

实现此目的的一种特别方便的方法是为我们提供一个专门用于测试的 Sqlite3 数据库,并将您的应用程序设置为使用该数据库进行测试。

关于php - TDD:如何测试搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7409607/

相关文章:

java - Java 和 .NET 的测试和模拟框架

ruby-on-rails - 测试 Nokogiri XML 的属性

c# - EF 中的 SaveChanges() 会导致插入未添加的对象吗?

php - 获取当前域

php - Laravel 存储文件编码

android - 从命令行构建 UiAutomator 2.0

testing - 最有值(value)球员 : Dialog boxes that return value and testable code

缺少 PHP 扩展 VC 编译器信息

PHP 无法识别 http_get_request_headers()?

testing - 如何使用 groovy 在 jsr223 采样器中将大数字字符串转换为整数