ホームページ  >  記事  >  バックエンド開発  >  C++ 単体テストにおけるフェイクとスタブの使用シナリオは何ですか?

C++ 単体テストにおけるフェイクとスタブの使用シナリオは何ですか?

PHPz
PHPzオリジナル
2024-04-23 14:39:01572ブラウズ

単体テストでは、フェイクとスタブを使用してテストの分離を作成します。フェイク: テスト対象のユニットをシミュレートし、動作を制御し、相互作用を検証します。外部依存関係やテストが困難な依存関係を置き換えるために使用されます。スタブ: 常に固定値を返すか、指定されたアクションを実行する、特別な偽のシミュレートされた関数またはメソッド。時間のかかる依存関係や不安定な依存関係を置き換えるために使用されます。

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

C 単体テストにおける偽造とスタブの使用シナリオ

単体テストでは、テストの分離を作成するために偽造とスタブが使用されます環境のための 2 つの強力なテクノロジー。これにより、テスト開発者は他のコンポーネントに依存せずに特定のコードをテストできます。

モック

フェイクとは、動作を制御し、相互作用を検証できる、テスト対象ユニットのシミュレートされたバージョンを作成することです。 Fake は、外部依存関係やテストが困難な依存関係を置き換えるためによく使用されます。

例:

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

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

この例では、UserServiceMockUserService の偽物であり、## を制御するために使用されます。 # GetUser() メソッドの動作をテストで検証できるようにします。

スタブ (スタブ)

スタブは、常に固定値を返すか、指定されたアクションを実行する関数またはメソッドをシミュレートする特別な種類の偽造です。スタブは、時間のかかる依存関係や不安定な依存関係を置き換えるためによく使用されます。

例:

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

ユースケース

フェイクとスタブには、単体テストで次のような複数のユースケースがあります。

    外部依存関係との相互作用をテストします。
  • 難しい操作や時間のかかる操作を分離します。
  • パラメータの受け渡しと関数の呼び出し順序を確認します。
  • エラー処理と例外条件をテストします。

実際的なケース

UserService からユーザーを取得し、データベース内のユーザーのパスワードを更新する関数があるとします。

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

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);
}

このテスト ケースでは、 ,

GetUser() が 1 回呼び出され、期待されるユーザーが返されることを確認します。次に、ユーザーのパスワードが正しく更新されたことをアサートします。

以上がC++ 単体テストにおけるフェイクとスタブの使用シナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。