2

目前,我正在更深入地研究测试技术,尽管我不确定我是否仍然居住在 unittest 领域或已经将其留在了集成测试领域。

让我详细说明一下,给定两个组件 A 和 B 并且 A 使用 B,那么我们对 B 有一定的“向上合同”,对于 A 有一定的“向下合同”。基本上这意味着:如果 A 正确使用 B 并且B 行为正确,那么两个合同都将得到履行,一切都会正常工作。

我认为模拟是一种保证给定测试用例所需的向上契约子集的方法。例如,如果数据记录之前已插入,则数据库连接可能具有检索数据记录的向上合同。数据库连接模拟保证返回某些记录,而不需要将它们插入数据库。

但是,我目前想知道是否也有办法验证向下合同。给定数据库连接的示例,向下契约可能是:您必须连接到数据库并确保连接存在且有效,并输入正确的 SQL 查询。

有没有人做这样的事情?这值得为更复杂的合同工作吗?(例如,数据库连接可能需要 SQL 解析器才能完全验证对数据库层的调用)

问候,泰达

4

2 回答 2

1

有人这样做吗?

是的,我有时使用模拟来验证“向下合同”。

例如,您可以使用 DB 模拟来检查用于登录的凭据是否正确。特别是,如果您有其他子系统的接口,那么您可以模拟它们并让模型检查使用违规。

例如,如果子系统需要初始化调用或某种注册,那么您的子系统接口模型也可以强制执行此操作。


值得这份工作吗?

这取决于你希望你的测试有多深,让我给你一些不同“深度”的例子:

  1. 如果您想检查对接口的正确调用顺序,那么一个简单的状态机可能就足够了。
  2. 如果您想验证界面语言(在您的示例中为 SQL)的正确使用,您必须使用解析器。
  3. If You want to verify that it actually works with the real subsystem, then make an integration test (cannot be done with mockups).

Conclusion:

If appropriate, it should be done. However, You cannot expect a mockup to find each and every wrong use of the interface. E.g. a database mockup hardly detects, if there will be a deadlock caused by two concurrent transactions.

于 2008-11-08T10:54:18.373 回答
1

This is really the difference between mocks and stubs - mocks verify exactly that (or at least can do so - you can use mocks as stubs with most frameworks). Essentially, mocks allows you to do protocol testing rather than just "if you call X I'll give you Y". Every mocking framework I've used allows you to easily verify things like "all these calls were made" and "these calls happened in a particular order".

The more protocol you enforce between components, the more brittle the tests will be - sometimes that's entirely appropriate (e.g. "you must authenticate before you perform any other operations") but it's easy to end up with tests which have to be changed every time you change the implementation, even in a reasonable way.

于 2008-11-08T10:54:51.133 回答