【发布时间】:2018-11-16 08:29:15
【问题描述】:
我有一个基于 C# 编码的 TCP 的客户端-服务器系统。我被要求添加一个双向心跳来发现网络中的任何元素是否冻结并且没有响应。
我通过从服务器向所有连接的客户端发送心跳并等待响应解决了这个问题。如果响应没有按时到达,则会超时,如果服务器在 2 秒内没有发送任何心跳(假设服务器已冻结),则客户端会超时。
一切都在内部发生,服务器和客户端都会公开任何事件(接收心跳、回复心跳,按照请求静默发生)
问题是......如何为这样的功能创建单元测试或集成测试?
注意:我在 Visual Studio、C#、.Net 4.6.1 中编码,使用 NUnit3 进行测试
简单的伪代码示例:
//we have one connector for each connected client
class connector{
//if the echoReceived timer is not reseted on time it will complain
Timer echoReceived = new Timer(200ms);
//Another timer for sending beats
Timer heartbeatSender = new Timer (1000ms);
OnClientConnected(Client)
{
echoReceived.elapsed += () => { ShowError("Client did not reply") };
heartbeatSender.elapsed += () => {
Send(client, new Message(Heartbeat));
echoReceived.Enabled = true;
});
heartbeatSemder.isEnabled = true;
}
OnNewMessageFromClient(Client, message)
{
if(message is echoedHeartBeat)
{
echoReceived.Enabled= false;
echoReceived.Reset();
}
}
}
在客户端
class client
{
Timer ServerDeadTimeOut = new Timer (1000ms);
OnStart()
{
serverDeadTimeOut.Elapsed += () => { ShowError("Server is dead"); };
serverDeadTimeOut.isEnabled = true;
}
OnNewMessageFromServer(message)
{
if(message is HeartBeatMessage)
{
serverDeadTimeOut.Reset();
Send(new HeartBeatEchoMessage);
}
}
}
【问题讨论】:
-
抽象出实现问题,以便更灵活地测试预期行为。
标签: c# unit-testing nunit client-server integration-testing