【发布时间】:2014-07-30 08:21:27
【问题描述】:
这个问题可能过于本地化了。 假设我有论坛系统要测试。让我们删除一个用户和他的帖子。为了简单起见,让我使用一个伪代码:
class User
{
function add() { ... }
function delete (userID)
{
container::getOrCreateUserPostObject.deletePostsByUserID (userID)
DELETE FROM users WHERE ID = userID
}
}
class UserPost
{
function deletePostsByUserID (userID)
{
DELETE FROM posts WHERE USERID = userID
}
}
现在必须对此进行测试:
function testDeleteUser()
{
container::getOrCreateUserObject.add();
container::getOrCreateUserObject.add();
container::getOrCreateUserObject.delete (1)
// now check in the DB that how many records left, really one was deleted etc.
}
另一个测试
function testDeletePosts
{
container::getOrCreateUserPostObject.deletePostsByUserID (1);
// again, now check in the DB that how many records left, really one was deleted etc.
}
到目前为止,这看起来还不错。用户删除和用户帖子删除工作,他们的测试独立。
是的,独立的。我们检查是否可以删除用户并检查是否可以删除他的帖子。我们没有检查我们是否删除了用户的帖子作品!有两个很好的“乐高”元素,但如果我们把它们放在一起可以吗?
如果我把这个“全局”测试放到testDeleteUser() 然后我重复删除后的测试代码......
【问题讨论】:
-
您在 User 和 UserPost 之间引入了紧密耦合,这使得基本上不可能单独测试 User 或给它一个模拟 UserPost 来使用它。
-
单元测试的全部意义在于您独立地测试功能单元,这样您就不会同时测试依赖项,并且你可以通过模拟任何依赖项来做到这一点。
-
GordonM,好吧,我不使用“静态”类,它们实际上是对象,可以替换和模拟
-
那么如何一起测试它们,在哪里?如果它不是“单元测试”,那么它就是“集成测试”?
-
测试应用程序是否正常工作,删除用户也会删除用户发布的所有内容,这将是一个集成测试......通常 BDD 工具将用于自动化/编写该类型的测试
标签: java php unit-testing testing junit