Maison  >  Article  >  développement back-end  >  Quels sont les scénarios d’utilisation de la falsification et du stubbing dans les tests unitaires C++ ?

Quels sont les scénarios d’utilisation de la falsification et du stubbing dans les tests unitaires C++ ?

PHPz
PHPzoriginal
2024-04-23 14:39:01616parcourir

Dans les tests unitaires, les faux et les stubs sont utilisés pour créer une isolation de test : faux : simulez l'unité testée, contrôlez le comportement et vérifiez les interactions, utilisés pour remplacer les dépendances externes ou difficiles à tester. Stub : une fausse fonction ou méthode spéciale simulée qui renvoie toujours une valeur fixe ou effectue une action spécifiée, utilisée pour remplacer des dépendances fastidieuses ou instables.

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

Scénarios d'utilisation de falsification et de stubbing dans les tests unitaires C++

Dans les tests unitaires, la falsification et le stubbing sont deux techniques puissantes pour créer des environnements d'isolation de tests. Ils permettent aux développeurs de tests de tester du code spécifique sans s'appuyer sur d'autres composants.

Mock

Mock est la création d'une version simulée de l'unité testée qui vous permet de contrôler son comportement et de vérifier ses interactions. Fake est souvent utilisé pour remplacer des dépendances externes ou difficiles à tester.

Par exemple :

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

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

Dans cet exemple, UserServiceMock est un faux de UserService et est utilisé pour contrôler le comportement de GetUser() méthode , afin qu'elle puisse être vérifiée lors de tests. <code>UserServiceMockUserService 的伪造,用于控制 GetUser() 方法的行为,以便可以在测试中对其进行验证。

存根(Stub)

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

例如:

// 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()

🎜Stub 🎜🎜🎜Un stub est un type particulier de contrefaçon qui simule une fonction ou une méthode qui renvoie toujours une valeur fixe ou effectue une action spécifiée. Les stubs sont souvent utilisés pour remplacer des dépendances chronophages ou instables. 🎜🎜🎜Exemple : 🎜🎜rrreee🎜🎜Cas d'utilisation 🎜🎜🎜Les faux et les stubs ont plusieurs cas d'utilisation dans les tests unitaires, notamment : 🎜
  • Test des interactions avec des dépendances externes.
  • Isolez les opérations difficiles ou chronophages.
  • Vérifiez le passage des paramètres et l'ordre d'appel de la fonction.
  • Testez la gestion des erreurs et les conditions d'exception.
🎜🎜Cas pratique🎜🎜🎜Supposons que nous ayons une fonction qui récupère l'utilisateur de UserService et met à jour le mot de passe de l'utilisateur dans la base de données : 🎜rrreee🎜Nous pouvons créer une unité Scénario de test, utilisez UserServiceMock pour simuler UserService et vérifier le comportement correct de la fonction : 🎜rrreee🎜Dans ce cas de test, nous nous assurons que GetUser() code> est Il a été appelé une fois et l'utilisateur attendu a été renvoyé. Nous affirmons alors que le mot de passe de l'utilisateur a été correctement mis à jour. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn