如何模拟套接字错误? (有时服务器或客户端由于某些套接字错误而断开连接,因此无法重现。) 我正在寻找一个工具来做到这一点,但我找不到一个。 有没有人知道一个工具或有一个如何做到这一点的代码示例? (C#或C / C ++)
答案 0 :(得分:6)
为您用来访问套接字的API添加一个包装器层,让它们失败rand()%100> x%的时间。
答案 1 :(得分:1)
今年夏天我遇到了同样的问题。
我有一个自定义Socket
课程,想要测试read
或write
引发异常会发生什么。我真的想模仿Java模拟框架,我这样做了:
我将Socket
类继承到FakeSocket
类,并创建了一个名为SocketExpectation
的东西。然后,在单元测试中,我创建了假套接字,设置了期望值,然后将假套接字传递给我想要测试的代码。
FakeSocket
有这些方法(删除不需要的细节):
uint32_t write(buffer, length); // calls check
uint32_t read(buffer, length); // calls check
bool matches();
void expect(expectation);
uint32_t check(CallType, buffer, length) const;
他们都很直接。 check
根据当前期望检查参数,如果一切都按计划进行,则继续执行SocketExpectation
要求。
SocketExpectation
有这个大纲(也被删除):
typedef enum { write, read } CallType;
SocketExpectation(CallType type);
SocketExpectation &with_arguments(void *a1, uint32_t a2); // expects these args
SocketExpectation &will_return(uint32_t value);
SocketExpectation &will_throw(const char * e); // test error handling
bool matches();
我在需要时添加了更多方法。我会像这样创建它,然后将假套接字传递给相关方法:
fake_socket = FakeSocket();
fake_socket.expect(SocketExpectation(write).with_arguments(....).will_return(...));
fake_socket.expect(SocketExpectation(read).with_arguments(...).will_throw("something"));
答案 2 :(得分:0)
我的套接字代码单元测试可能更好地描述为集成测试,因为我驱动测试代码以连接到“模拟”远程对等体。由于远程对等体在测试的控制之下(它只是一个简单的客户端或服务器),我可以通过测试使远程对等体以各种方式中断连接,然后确保被测代码按预期做出反应。设置需要一些工作,但是一旦你掌握了所有部分,就可以测试大多数情况。
所以,我想,我的建议是,不要试图模拟你遇到的情况,而应该理解它们,然后可靠地生成它们。