【发布时间】:2011-08-04 11:05:27
【问题描述】:
我正在尝试为尚未实现的 Queue 类提出一个测试用例。在尝试为 testEnqueue 方法编写代码时,除了使用 size() 或 dequeue() 之外,我找不到其他验证方法。
是否可以使用其他公共方法(例如:size/dequeue)来验证同一类的公共方法(入队)的测试用例?
【问题讨论】:
标签: unit-testing junit tdd
我正在尝试为尚未实现的 Queue 类提出一个测试用例。在尝试为 testEnqueue 方法编写代码时,除了使用 size() 或 dequeue() 之外,我找不到其他验证方法。
是否可以使用其他公共方法(例如:size/dequeue)来验证同一类的公共方法(入队)的测试用例?
【问题讨论】:
标签: unit-testing junit tdd
是的,这无疑是一种适当的验证方式。
【讨论】:
是的,通过对象的外部接口进行测试是理想的(而不是侵入其内部进行验证)。只要每个行为都经过测试,你就不应该有任何问题。如果 Enqueue 依赖于 Size() 并且 Size 已经被证明可以按预期工作,那么您可以像您提到的那样安全地编写测试。
对于这个例子,我可能从实现 Size() [0 个元素,使用 1 个元素创建的队列,n 个元素] 开始。然后移动到 Enqueue() 并验证 Size 是否增加了 1。
你在正确的轨道上。
【讨论】:
据我了解,您在这里看到了一个典型的先有鸡还是先有蛋的问题 - 您如何测试 a() 并使用 b() 验证其行为,然后使用 a() 测试 b()。从理论上讲,如果两者都不正确,测试可能仍然通过......就像使用 JUnit 测试 JUnit。
但是,如果您将代码视为一个黑盒(在执行 TDD 时就是这种情况),并且您只是编写为您的类/单元提供一些输入并验证输出的测试,那么这种方法没有任何问题。请记住测试所有典型案例和极端案例/边界条件 - 如果它们符合您的业务预期,会出现什么问题?
【讨论】: