Unit testing 如果我直接测试一个使用表数据网关模式的表类,这仍然是一个单元测试吗?

Unit testing 如果我直接测试一个使用表数据网关模式的表类,这仍然是一个单元测试吗?,unit-testing,integration-testing,Unit Testing,Integration Testing,考虑一下这样的情况: class UsersTable { public function findUserById($id) { $sql = "..."; return $this->adapter->execute($sql); } } 整个类几乎都是包装SQL语句的方法,实际上没有复杂的逻辑。我基本上是在测试SQL本身 我知道命中数据库的测试通常是集成测试,但这仍然是一个集成测试吗?因为它被直接测试,就像单元测试一样?

考虑一下这样的情况:

class UsersTable
{
    public function findUserById($id)
    {
        $sql = "...";
        return $this->adapter->execute($sql);
    }
}
整个类几乎都是包装SQL语句的方法,实际上没有复杂的逻辑。我基本上是在测试SQL本身


我知道命中数据库的测试通常是集成测试,但这仍然是一个集成测试吗?因为它被直接测试,就像单元测试一样?

我会说,因为您的测试不仅仅是特定单元(findUserById)的逻辑,它是一个集成测试。如果您想正确地进行单元测试,我将研究模拟对象和依赖项注入。因为看起来您正在使用PHP,所以我猜您可能正在使用phpUnit进行单元测试,phpUnit允许模拟。要对该函数进行单元测试,您需要模拟适配器成员的execute方法,并断言使用正确的$sql字符串调用了它一次。出于这些目的,我想说您应该假设execute方法工作正常,因此无需对其进行测试。是phpUnit的一个链接,它描述了它们的对象模拟。

我发现这些集成测试非常有用,可以很好地补充您的纯单元测试。它们为您提供了一个良好的指示,表明您的数据库已正确连接,并且与对象模型兼容。 当我包含这些类型的测试时,我不打算模拟db,因为我可以很容易地在集成测试中完成所有测试。 但是,我建议将测试所依据的数据作为测试的先决条件

我基本上遵循这种模式:

1) 将用户添加到数据库 2) 在此处调用正在测试的方法 3) 断言检索到的用户与刚才创建的用户相同

使用这种模式,您不必依赖数据库中的现有数据,这些数据可能会随着时间的推移而变化,并使您的测试变得脆弱