我们应该如何为测试设置复杂的情况?

时间:2010-03-08 22:08:28

标签: testing integration-testing

我正在研究我称之为集成测试的东西。我想验证如果调用WCF服务,它将完成我期望的工作。

我们来看一个非常简单的场景。假设我们有一个合约对象,我们可以暂停或暂停。现在编写暂停测试非常简单。您创建一个契约实例并执行将其放在代码上的代码。

当我们想要测试起飞暂停服务电话时,问题就出现了。问题是暂停合同实际上可能非常复杂,导致各种对象都被修改。所以通常我会使用Builder模式并做这样的事情。

var onHoldContract = new ContractBuilder()。PutOnHold()。Build();

我遇到的问题是现在我必须复制我的暂停服务的大部分内容。现在当我改变什么东西搁置意味着我有两个地方我必须修改。

立即向我跳出的另一个选择就是在我的测试设置中使用暂停服务,但现在我将我的测试与另一段代码的成功结合起来,这是我不做的事情喜欢这样做,因为它可能导致一个地方的失败打破其他地方的无关测试(例如,如果搁置失败)。

我错过了其他任何选项吗?或者哪种方法更可取的意见和原因?

2 个答案:

答案 0 :(得分:1)

模拟框架是单元测试的好选择。但是根据我的理解,你在这个阶段实际上正在进行整合吗?因此,您将WCF服务称为黑盒子(从客户端的角度来看)。我假设当你执行On Hold操作时,你必须在存储库(数据库,XML文件等)上做一些持久性。

在这种情况下,仅在测试端的模拟框架对您没有多大帮助,因为为了测试Off Hold操作,您需要一个处于正确状态的On Hold对象,包括存储库条目等。似乎我不需要重新发明轮子的唯一方法就是使用该服务将其置于保持状态。但是,如果你想要解耦,那么你将需要设置环境,这意味着代码重复(我实际上必须在一些集成测试场景中执行此操作 - 我要做的是在测试开始时设置它运行)。

请注意,在服务本身的实现中,您的单元测试将处于较低级别,并且您应该尽可能地将其解耦 - 这是我将应用Mock Framework的地方。

我希望这会有所帮助。

答案 1 :(得分:-1)

您可以查看使用mocking framework

模拟框架允许您创建“模拟”对象,这些对象可以取代您的真实对象,并在测试中使用时以特定方式响应。这将允许您直接创建人工“保持”合同对象,然后将其传递给您的“暂停”服务。您可以在模拟上定义可以验证的特定行为,以便在被取消时正确地执行操作。

您没有提及您的语言,但所有主要语言都有可用的模拟框架。对于.net,一些示例将是NMockRhino mocks。对于Java,流行的是Mockito。如果您使用任何语言进行谷歌搜索,您会发现更多信息。