我正在将旧的C代码转换为C ++,并在用GoogleTest重写时对其进行测试。我的部分代码使用套接字通过IPV4地址连接到远程主机。在了解如何使用GoogleTest和GoogleMock测试代码的套接字部分时,我遇到了很多麻烦。
我的对象输入了主机IP地址和等待再次尝试连接到主机之前要等待的秒数。实际上有一个名为“ conn()”的函数试图连接到主机。那就是我要测试的功能。因此,在测试中,我想做类似的事情:
TEST(CONNECTION_TEST, Connection)
{
MyObject obj("###.###.###.###", 1);
ASSERT_TRUE(obj.conn());
}
我在这里读到我需要模拟服务器,因为实际上不建议测试远程主机。我是GoogleMock的新手,因此我阅读了官方文档并阅读了GoogleTest primer,GoogleMock For Dummies,GoogleMock Cheat Sheet和GoogleMock Cookbook。我看了CodesBay的tutorial。我查看了关于SO的几篇文章,包括What is wrong with my attempts to mock a simple C++ method with googlemock?,Patterns for unit testing a C++ method that makes a standard library call和How to unit test BSD sockets。
对于我的模拟服务器,我做了以下工作。我制作了一个包装socket.h的Socket类,然后从中扩展了MockSocket。在我的TEST中,我将模拟套接字设置为接受连接,如下所示:
TEST(CONNECTION_TEST, Connection)
{
// bind to local host?
MyObject obj("0.0.0.0", 1);
// create the host
MockSocket mock_sock;
MockSocket new_sock;
EXPECT_CALL(mock_sock, create()).Times(1);
EXPECT_CALL(mock_sock, bind(_));
EXPECT_CALL(mock_sock, listen());
EXPECT_CALL(mock_sock, accept(_));
mock_sock.create();
mock_sock.bind(123);
mock_sock.listen();
mock_sock.accept(new_sock);
ASSERT_TRUE(obj.conn());
}
您可以说,我不知道自己在做什么。我的测试结果失败了,我认为这是因为我没有正确执行此操作。拜托,有人可以指引我正确的方向吗?模拟服务器是测试我的对象的正确方法吗?
答案 0 :(得分:1)
您要测试什么?
您是否要测试TCP / IP套接字类(假设有一个)是否可以实际连接某些TCP / IP服务并与之通信?这更是一个端到端的测试。您可以使用Google Test来执行此操作,但需要运行的TCP / IP服务进行通信。这不是Google模拟框架的用途。这类似于您要测试读取文件的类时:您需要拥有一个可以读取的文件,而Google模拟框架在这里无法为您提供帮助。
您是否要测试其他使用TCP / IP套接字类的类是否工作?在这里,您可以使用Google模拟框架为套接字类创建模拟。该模拟将充当您其他类的套接字类,但不会进行任何TCP / IP通信。这样,您就可以对其他课程进行单元测试。