单元测试数据库交互者

时间:2013-04-08 07:50:36

标签: database unit-testing testing tdd

我有一个数据库交互组件,其中包括Writer和Reader类。 writer类具有insertEntity(Entity)和updateEntity(Entity)等编写方法,而Reader具有getEntityById(EntityId)等方法。

为了实现这个组件,我想像往常一样使用TDD,但不确定如何管理它。如果我从实现Writer开始,如果我还没有Reader方法,我将如何进行有意义的断言。即使我有读者方法,我最好不要在编写器的测试中使用它们,尽管这可能是一厢情愿的想法。

测试此类代码似乎本身就很痛苦,因为需要设置和删除表格。然而,由于我之前没有尝试过为这样的代码做TDD,我可能会错过任何使这个相对无痛的技巧。任何有关它的指针都表示赞赏。

2 个答案:

答案 0 :(得分:1)

只要您有抽象,就不需要数据库。

例如,如果我创建了一个方法getEntityById,我可以拥有一个使用内存存储(数组,哈希等)的类。虽然我的生产代码会使用具体的实例。在伪代码中:

class MemoryStore
{
    getEntityById(id)
    {
       // Return hardcoded response or canned results
    }
}

class DatabaseStore
{
    getEntityById
    {
        // Go off to the real database and do reads.
    }
}

然后,您可以在没有访问真实数据库的情况下为您编写测试。请记住,如果您使用第三方服务,API,数据库,文件系统等...您不是单元测试。

这里的另一个好处是,您可以让另一个开发人员处理数据库访问代码,同时处理应用程序的其余部分。这一切都依赖于“编码到界面”。

如果要测试数据库访问代码该怎么办?那么你会想要一个综合测试。这里将使用一个真实的数据库,您可以实例化读/写数据库的代码。当然,这将是缓慢的并且需要种子数据。关键是你测试这些独立的,你的其余应用程序将使用内存假货。所以在上面的例子中,只要DatabaseStore单独工作,我们就可以确信其余的代码做了正确的事情。

答案 1 :(得分:1)

我所做的是首先实现我的CREATE方法,然后通过直接查询数据库并通过我的DAO的READ方法而不是来测试它们。当这些通过时,您可以使用CREATE方法编写READ测试,以使用测试数据填充数据库,然后实现READ方法。

在每次测试后设置和拆除数据库时,请在您的设置和拆卸方法中执行此操作。