如何使用 GoogleMock 设置模拟服务器
How to set up a mock server with GoogleMock
我正在将旧的 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, the GoogleMock Cheat Sheet, and the GoogleMock Cookbook. I watched CodesBay's tutorial. I looked at several posts on SO, including 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, and .
对于我的模拟服务器,我执行了以下操作。我做了一个 Socket class 包装 socket.h,然后我从它扩展了 MockSocket。在我的测试中,我将模拟套接字设置为接受连接,如下所示:
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());
}
如你所知,我不知道自己在做什么。我的测试结果失败了,我认为这是因为我没有正确地做到这一点。拜托,有人可以指导我正确的方向吗?模拟服务器是测试我的对象的正确方法吗?
你想测试什么?
您想测试 TCP/IP 套接字 class(假设有一个)是否真的可以与某些 TCP/IP 服务连接和通信?这更像是一个端到端的测试。您可以使用 Google 测试来执行此操作,但您需要 运行 TCP/IP 服务才能与之通信。这不是 Google 模拟框架的用途。这类似于当你想测试一个读取文件的 class 时:你需要有一个它可以读取的文件,而 Google 模拟框架在这里不会帮助你。
您想测试使用您的 TCP/IP 插座 class 的其他 class 是否有效吗?在这里,您可以使用 Google 模拟框架为您的套接字 class 创建模拟。这个模拟将充当你的另一个 class 的套接字 class 但不会进行任何 TCP/IP 通信。这样你就可以对你的另一个 class.
进行单元测试了
我正在将旧的 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, the GoogleMock Cheat Sheet, and the GoogleMock Cookbook. I watched CodesBay's tutorial. I looked at several posts on SO, including 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, and
对于我的模拟服务器,我执行了以下操作。我做了一个 Socket class 包装 socket.h,然后我从它扩展了 MockSocket。在我的测试中,我将模拟套接字设置为接受连接,如下所示:
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());
}
如你所知,我不知道自己在做什么。我的测试结果失败了,我认为这是因为我没有正确地做到这一点。拜托,有人可以指导我正确的方向吗?模拟服务器是测试我的对象的正确方法吗?
你想测试什么?
您想测试 TCP/IP 套接字 class(假设有一个)是否真的可以与某些 TCP/IP 服务连接和通信?这更像是一个端到端的测试。您可以使用 Google 测试来执行此操作,但您需要 运行 TCP/IP 服务才能与之通信。这不是 Google 模拟框架的用途。这类似于当你想测试一个读取文件的 class 时:你需要有一个它可以读取的文件,而 Google 模拟框架在这里不会帮助你。
您想测试使用您的 TCP/IP 插座 class 的其他 class 是否有效吗?在这里,您可以使用 Google 模拟框架为您的套接字 class 创建模拟。这个模拟将充当你的另一个 class 的套接字 class 但不会进行任何 TCP/IP 通信。这样你就可以对你的另一个 class.
进行单元测试了