phpunit中的可重用测试

时间:2015-11-10 07:02:05

标签: phpunit integration-testing

假设我想在三种状态下测试数据库一致性:

  1. 插入数据后 - 我想确保已将一定数量的行插入数据库表。

  2. 数据更新后 - 我想重复行数量测试(数量必须与插入后相同)

  3. 删除数据后 - 我想确保删除所有数据。

  4. 此外,当我插入或更新时,某些文件(图像)可以上传到服务器,文件路径将存储在数据库中。所以我还想检查文件数量是否与数据库文件表中的行数相对应。

    换句话说,我希望在插入和更新后重用两种方法:testRowsAmountOnAddUpdatetestFilesAmountOnAddUpdate

    组织代码的最佳方法是什么?我应该使用灯具吗?

2 个答案:

答案 0 :(得分:0)

事实上我已经来到了这个结构(代码很简单):

class MyTest extends PHPUnit_Framework_TestCase
{

     private static $expectedRowsAmountInDB;

     private function getRowsAmountFromDB()
     {
           //using this method to get rows count from DB
     }

     public function setUp()
     {
          //import initial data, set up the world
     }

     public function testRowsAmountOnAdd()
     {
          //count rows amount after setup
          //using getRowsAmountFromDB helper method
          $this->assertEquals(self::$expectedRowsAmountInDB, $this->getRowsAmountFromDB());
     }

     public function testRowsAmountOnUpdate()
     {
          //...here comes update rows code
          $this->assertEquals(self::$expectedRowsAmountInDB, $this->getRowsAmountFromDB());
     }

     public function testRowsAmountOnDelete()
     {
          //...here comes delete rows code
          $this->assertEquals(self::$expectedRowsAmountInDB, $this->getRowsAmountFromDB());
     }

     public function tearDown()
     {
          //delete all rows that were created in this test
          //and back DB to the original state
     }


}

答案 1 :(得分:0)

正如一些评论所说的那样,只要有可能,最好模拟数据库intarction层,但有时你只需要测试代码和数据库之间的交互,特别是复杂的查询。我个人用这个用于数据库装置和断言:(呃,免责声明,我也记得这个,所以我有偏见)

https://github.com/malteriesch/test-db-acle

它允许以管道分隔的表格格式插入数据,同时将默认值插入任何非空列,然后检查数据库的状态。

$this->setupTables("
        [address]
        address_id  |company
        1           |me
        3           |you

        [user]
        user_id  |name
        10       |John
        20       |Mary

    ");
// excercise the SUT, e.g.
$this->addressService->addEntry("them");

$this->assertTableStateContains("
        [address]
        address_id  |company
        1           |me
        3           |you
        100         |them #this is the new row inserted

        [user]
        user_id  |name
        10       |John
        20       |Mary
        ");
}

也许你可以将它们包装在testRowsAmountOnAddUpdatetestFilesAmountOnAddUpdate中,对于文件上传,我会读取该字段的值,然后断言那里指定的文件存在。

请注意,DBUnit也是一个很好的方法,我个人喜欢尽可能简单易懂地编写测试,只关注实际更改/与测试相关的信息。对我来说,其他方法只是有点冗长。