单元测试是否应包括您正在测试的内容的相反情况?

时间:2016-10-11 01:26:20

标签: unit-testing testing automated-tests

想象一下,我们有一个游戏,其中包含不同类型的服务器来代表不同的国家/地区。现在,让我们说游戏只允许用户和朋友一起玩#34;仅与其帐户所在的服务器位于同一服务器的其他播放器。作为一名开发人员,我的任务是编写一个测试用例,只是为了查看用户的功能是否为了#bud;"彼此有效。然而,这就是我的困境所在,因为我只需要测试一个用户是否可以"伙伴"别人,我是否还必须测试用户是否无法在同一测试用例中添加来自其他服务器的用户,还是应该在另一个完全独立于我正在编写的测试用例的测试用例中编写?

1 个答案:

答案 0 :(得分:1)

是的,你应该。

您正在描述的第一个测试,即您只是测试他们是否可以拥有好友,被称为Happy Path testing。您正在测试它是否正常运行,没有例外或错误或奇怪的用例。

Happy Path测试是一个良好的开端。其他一切都是真正有趣的开始。

在你的情况下,想到的事情是......

  • 如果他们和无效的好友一起玩,该怎么办?
  • 如果他们与已经是他们的好友的人交朋友怎么办?
  • 如果他们与某些不属于用户的人交往,该怎么办?

如何组织这些是一个品味问题。理想情况下,他们都是独立的测试。这样可以通过测试名称清除每个测试的目的,并避免测试之间的交互和依赖关系。这是一个没有特定语言的草图。

describe add_buddy {
    test happy_path {
        assert user.add_buddy(valid_buddy);
        assert user.buddies.contains(valid_buddy);
    }

    test buddy_on_another_server {
        buddies = user.buddies;
        assert !buddies.contains(invalid_buddy);

        assertThrows {
            user.add_buddy(invalid_buddy);
        } InvalidBuddy;

        assert buddies == user.buddies, "buddy list unchanged";
    }

    test buddy_with_non_user {
        buddies = user.buddies;

        assertThrows {
            user.add_buddy(non_user);
        } ArgumentError;

        assert buddies == user.buddies, "buddy list unchanged";
    }

    test buddy_an_existing_buddy {
        assert user.add_buddy(valid_buddy);

        # Should this return true? False? An exception?
        # You have to decide. I decided false.
        assert !user.add_buddy(valid_buddy);

        # The buddy is only on the list once.
        assert user.buddies.numContains(valid_buddy) == 1;
    }
}

uservalid_buddy之类的内容可以在setup例程中创建,或者更好地通过Factory_Girl等灯具生成器提供。