假设我想在三种状态下测试数据库一致性:
插入数据后 - 我想确保已将一定数量的行插入数据库表。
数据更新后 - 我想重复行数量测试(数量必须与插入后相同)
删除数据后 - 我想确保删除所有数据。
此外,当我插入或更新时,某些文件(图像)可以上传到服务器,文件路径将存储在数据库中。所以我还想检查文件数量是否与数据库文件表中的行数相对应。
换句话说,我希望在插入和更新后重用两种方法:testRowsAmountOnAddUpdate
和testFilesAmountOnAddUpdate
。
组织代码的最佳方法是什么?我应该使用灯具吗?
答案 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
");
}
也许你可以将它们包装在testRowsAmountOnAddUpdate
和testFilesAmountOnAddUpdate
中,对于文件上传,我会读取该字段的值,然后断言那里指定的文件存在。
请注意,DBUnit也是一个很好的方法,我个人喜欢尽可能简单易懂地编写测试,只关注实际更改/与测试相关的信息。对我来说,其他方法只是有点冗长。