客户端 - 服务器应用程序上的TDD

时间:2010-02-22 03:47:56

标签: unit-testing tdd client-server protocols network-protocols

目前我正在创建一个服务器应用程序来接收特定于协议的消息。我需要创建测试以确保我已正确实现协议。这是某种集成测试吗?如果是肯定的,我可以使用单元测试工具进行集成测试吗?最后,创建这类测试的最佳方法是什么?

1 个答案:

答案 0 :(得分:5)

如果您知道正确的答案是什么,那么这就是我要做的事情:

将负责处理协议逻辑的类与处理连接机制的代码分开。

一次编写一个测试,指定给定输入消息集的正确响应。

实施这些行为。

例如,如果应该使用“howdy”消息回复“hello”消息,那么您的测试可能如下所示:

Mock<IProtocolOut> outbound = new Mock<IProtocolOut>();
MyProtocolHandler handler = new MyProtocolHandler(outbound); // assuming that the handler takes the outbound receiver as a parameter.
outbound.Expect(o=>o.HowdyMessage()); // we expect to get a HowdyMessage back
handler.HelloMessage(); // 'fake' a HelloMessage into the handler
outbound.VerifyAll(); // assert that the 'howdy' message was sent.

在这种情况下,所有模拟都声称已经进行了某些调用。这可以通过手工操作类来完成验证 - 模拟没有任何魔力,它们只是更容易进行这种类型的验证。

如果你有一个支持Arrange / Act / Assert的模拟库,它看起来更像是这样:

Mock<IProtocolOut> outbound = new Mock<IProtocolOut>();
MyProtocolHandler handler = new MyProtocolHandler(outbound); // assuming that the handler takes the outbound receiver as a parameter.
handler.HelloMessage(); // fake the message being sent
outbound.AssertWasCalled(o=>o.HowdyMessage());

当然,协议的接口不必用消息强类型化。你也可以做类似的事情:

Mock<IProtocolOut> outbound = new Mock<IProtocolOut>();
MyProtocolHandler handler = new MyProtocolHandler(outbound); // assuming that the handler takes the outbound receiver as a parameter.
handler..ReceiveMessage("hello"); // fake the message being sent
outbound.AssertWasCalled(o=>o.ReceiveMessage("howdy"));

(编辑以澄清测试范围)

这些都不需要“实际”连接。他们仅测试处理协议的逻辑方面,并假设您在逻辑协议处理和连接管理之间存在分歧。