所以,我想测试我的模型Queue
执行添加Item
的方式。我需要完成以下步骤:
队列在内部使用MongoDB。
我似乎有以下选择:
(a)清除执行相应MongoDB命令(db.queue.remove()
)的队列集合,调用queue.add (item)
,然后检查集合状态(db.queue.find()
或{ {1}});
(b)使用db.queue.find()
清除队列,然后拨打queue.clear()
,然后选中queue.add(item)
。
theese选项之间的区别是什么?选择其中一个而不是另一个的原因是什么? (a)看起来更“实用”,但在代码和测试中引入了一些脆弱性和代码重复(这是一个问题,顺便说一下?),但(b)让我觉得我测试了一切,但当时没什么特别的。
答案 0 :(得分:2)
使用(b)。您的单元测试不应该对被测试类的内部实现细节做出假设。 “测试行为,而不是实施”。如果内部实现发生变化,使用(a)将导致脆弱的测试失败。
答案 1 :(得分:0)
最后我结束了以下内容。
(a)和(b)方法与SUT的耦合不同。 (a)耦合较少,这是round-trip test,而(b)是紧耦合的,因此它是layer-crossing test。
第一个跟随所谓的Use the Front Door First Principle,第二个跟随Back Door Manipulation Principle。
第一种方法侧重于班级的公共合同。第二个 - 关于它的实施。
我们需要两种测试。第一个开发类的接口,第二个 - 驱动它的实现。
this nice article可以找到有关强烈分离这些测试重要性的更多细节。