我有一个“哲学”与同事的分歧,我希望听到社区对双方的看法(或者更好的第三种选择)。
基本上:我们有一个返回好友列表的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)
哪个更好,为什么?
还有其他选项比两者都好吗?
答案 0 :(得分:2)
纯粹的意见,但是:
测试文字会鼓励不良行为 - 文字测试非常脆弱,经常打破以至于人们通过更新文字来学习如何应对测试失败。即使他们打破了它,他们也可以说服自己这是正确的,更新文字,继续前进,无意中用测试巩固了一个错误,确保它不会被修复。
功能测试是正确的方法。有一些方法可以解决它 - 您可以轻松地编写一个看起来正确的功能测试,但即使代码被破坏也可以通过 - 但最好的解决方案是使用集成测试和功能测试,以确保服务实际上做了你期望的事情。
答案 1 :(得分:1)
您需要根据功能进行测试,而不是文字回复。
原则上,这允许人们以不破坏您已经编写的测试的方式更改格式(添加字段等)。当他们这样做时,你的测试不会破坏,这是他们应该做的。 (如果添加新字段不好,请为此编写测试。)
在实践中,文字文本测试有时会通过粘贴新字符串来修复,而真正的问题会被粘贴,而没有人给予他们足够的思考。
如果您希望确保响应不会以某种方式更改通过测试,但不能与数据的收件人一起使用,请包含一些基本级别的集成测试。