Rumah > pembangunan bahagian belakang > C++ > Apakah senario penggunaan pemalsuan dan stubbing dalam ujian unit C++?

Apakah senario penggunaan pemalsuan dan stubbing dalam ujian unit C++?

PHPz
Lepaskan: 2024-04-23 14:39:01
asal
643 orang telah melayarinya

Dalam ujian unit, palsu dan stub digunakan untuk mencipta pengasingan ujian: palsu: simulasi unit yang sedang diuji, mengawal tingkah laku dan mengesahkan interaksi, digunakan untuk menggantikan kebergantungan luaran atau sukar untuk diuji. Stub: Fungsi atau kaedah simulasi palsu khas yang sentiasa mengembalikan nilai tetap atau melakukan tindakan tertentu, digunakan untuk menggantikan kebergantungan yang memakan masa atau tidak stabil.

C++ 单元测试中伪造与存根的使用场景?

Senario penggunaan pemalsuan dan stubbing dalam ujian unit C++

Dalam ujian unit, pemalsuan dan stubbing ialah dua teknik berkuasa untuk mencipta persekitaran pengasingan ujian. Mereka membenarkan pembangun ujian menguji kod tertentu tanpa bergantung pada komponen lain.

Mock

Mock ialah penciptaan versi simulasi unit yang sedang diuji yang membolehkan anda mengawal kelakuannya dan mengesahkan interaksinya. Palsu sering digunakan untuk menggantikan kebergantungan luaran atau sukar untuk diuji.

Contohnya:

class UserService {
public:
  virtual User GetUser(int id) = 0;
};

class UserServiceMock : public UserService {
public:
  MOCK_METHOD(User, GetUser, (int id), (override));
};
Salin selepas log masuk

Dalam contoh ini, UserServiceMock ialah palsu UserService dan digunakan untuk mengawal kelakuan GetUser()< /code> kaedah , supaya ia boleh disahkan dalam ujian. <code>UserServiceMockUserService 的伪造,用于控制 GetUser() 方法的行为,以便可以在测试中对其进行验证。

存根(Stub)

存根是一种特殊的伪造,它模拟一个函数或方法,总是返回一个固定的值或执行指定的动作。存根通常用于替换耗时或不稳定的依赖项。

例如:

// SleepStub 不实际调用 sleep 函数,而是返回一个固定的值
class SleepStub {
public:
  static void Sleep(int) {}
};
Salin selepas log masuk

使用案例

伪造和存根在单元测试中有多个使用案例,包括:

  • 测试与外部依赖项的交互。
  • 隔离难以或耗时的操作。
  • 验证参数传递和函数调用顺序。
  • 测试错误处理和异常情况。

实战案例

假设我们有一个函数,它从 UserService 获取用户并在数据库中更新用户的密码:

void UpdateUserPassword(int userId, const std::string& newPassword) {
  auto user = userService.GetUser(userId);
  user.SetPassword(newPassword);
  db.UpdateUser(user);
}
Salin selepas log masuk

我们可以创建一个单元测试用例,使用 UserServiceMock 伪造 UserService 并验证函数的正确行为:

TEST(UpdateUserPassword, UpdatesPassword) {
  UserServiceMock userServiceMock;
  User expectedUser;
  EXPECT_CALL(userServiceMock, GetUser(userId)).WillOnce(Return(expectedUser));
  UpdateUserPassword(userId, newPassword);
  // Assert that the user password was set correctly
  ASSERT_EQ(expectedUser.GetPassword(), newPassword);
}
Salin selepas log masuk

在这个测试用例中,我们确保 GetUser()

🎜Stub 🎜🎜🎜Stub ialah sejenis pemalsuan khas yang menyerupai fungsi atau kaedah yang sentiasa mengembalikan nilai tetap atau melakukan tindakan tertentu. Stub sering digunakan untuk menggantikan kebergantungan yang memakan masa atau tidak stabil. 🎜🎜🎜Contoh: 🎜🎜rrreee🎜🎜Kes guna 🎜🎜🎜Tiruan dan stub mempunyai berbilang kes penggunaan dalam ujian unit, termasuk: 🎜
  • Menguji interaksi dengan kebergantungan luar.
  • Asingkan operasi yang sukar atau memakan masa.
  • Sahkan lulus parameter dan susunan panggilan fungsi.
  • Uji pengendalian ralat dan syarat pengecualian.
🎜🎜Kes praktikal🎜🎜🎜Andaikan kita mempunyai fungsi yang mendapatkan pengguna daripada Perkhidmatan Pengguna dan mengemas kini kata laluan pengguna dalam pangkalan data: 🎜rrreee🎜Kita boleh mencipta unit Kes ujian, gunakan UserServiceMock untuk memalsukan UserService dan sahkan kelakuan fungsi yang betul: 🎜rrreee🎜Dalam kes ujian ini, kami memastikan GetUser() code> is Ia dipanggil sekali dan pengguna yang dijangka dikembalikan. Kami kemudian menegaskan bahawa kata laluan pengguna telah dikemas kini dengan betul. 🎜

Atas ialah kandungan terperinci Apakah senario penggunaan pemalsuan dan stubbing dalam ujian unit C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan