【问题标题】:Excatly how to test? (Unittest, JUnit, PhpUnit)具体怎么测试? (单元测试、JUnit、PhpUnit)
【发布时间】: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


【解决方案1】:

我不知道我是否正确,但在测试中,你不应该像在 testDeletePosts() 中那样真正依赖特定的用户 ID,你应该在这里也添加一个用户,添加一些帖子,并再次删除这些帖子。所以你的测试是完全独立的。

更新:

类似这样用于检查参照完整性的东西

function testDeleteUsersAndPosts
{
    addedUsers[0] = user.add();
    addedPosts[0] = post.add(addedUsers[0], 'first Post')
    addedPosts[1] = post.add(addedUsers[0], 'second Post')

    addedUsers[1] = user.add();
    addedPosts[2] = post.add(addedUsers[1], 'third Post for the second user')

    // Check how many posts you have
    allPosts = post.get().count()

    for (id in addedUsers)
    {
         user.delete(id)
    }


    // Check how many posts you have now
    allPostsNow = post.get().count();

    return allPostsNow == (allPosts -3)
}

类似这样的东西仅用于检查帖子删除

function testDeletePosts
{
    userID = user.add();
    addedPost = post.add(userID, 'first Post')

    // Check how many posts you have
    allPosts = post.get().count()

    post.delete(addedPost)

    return post.get(addedPost) == false
}

【讨论】:

  • 嘿,谢谢你的回答,你能用真实的代码确认一下吗?
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 2011-06-18
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多