测试策略:断言响应的“功能”还是完全响应的断言?

时间:2011-08-15 21:50:44

标签: testing

我有一个“哲学”与同事的分歧,我希望听到社区对双方的看法(或者更好的第三种选择)。

基本上:我们有一个返回好友列表的JSON API。结果如下所示:

[{"name":"Bob", "uid":12345, "level":4}, {"name":"George", "uid":23456, "level":6}]

存在正常的“共同朋友”要求,这会影响回应。

分歧基本上是哪个更好,

  • 对响应的“功能”进行断言的测试:

    def test_results_are_sorted_by_name():
        .. <setup 2 friends> ..
    
        response = controller.getFriendsList()
        assertLessThan(response[0].name, response[1].name)
    
    def test_blocked_users_are_not_returned():
        .. <setup some friends and block one, storing the id in blocked_uid> ..
    
        response = controller.getFriendsList()
        for friend in response:
            assertNotEqual(friend.uid, blocked_uid)
    
  • 对文字回复进行断言的测试

    def test_results_are_sorted_by_name():
        .. <setup 2 friends> ..
    
        response = controller.getFriendsList()
        expectedResponse = {...}
        assertEqual(response, expectedResponse)
    
    def test_blocked_users_are_not_returned():
        .. <setup some friends and block one, storing the id in blocked_uid> ..
    
        response = controller.getFriendsList()
        expectedResponse = {...}
        assertEqual(response, expectedResponse)
    

哪个更好,为什么?

还有其他选项比两者都好吗?

2 个答案:

答案 0 :(得分:2)

纯粹的意见,但是:

测试文字会鼓励不良行为 - 文字测试非常脆弱,经常打破以至于人们通过更新文字来学习如何应对测试失败。即使他们打破了它,他们也可以说服自己这是正确的,更新文字,继续前进,无意中用测试巩固了一个错误,确保它不会被修复。

功能测试是正确的方法。有一些方法可以解决它 - 您可以轻松地编写一个看起来正确的功能测试,但即使代码被破坏也可以通过 - 但最好的解决方案是使用集成测试和功能测试,以确保服务实际上做了你期望的事情。

答案 1 :(得分:1)

您需要根据功能进行测试,而不是文字回复。

原则上,这允许人们以不破坏您已经编写的测试的方式更改格式(添加字段等)。当他们这样做时,你的测试不会破坏,这是他们应该做的。 (如果添加新字段不好,请为此编写测试。)

在实践中,文字文本测试有时会通过粘贴新字符串来修复,而真正的问题会被粘贴,而没有人给予他们足够的思考。

如果您希望确保响应不会以某种方式更改通过测试,但不能与数据的收件人一起使用,请包含一些基本级别的集成测试。