Heim >Backend-Entwicklung >C++ >Welche Anwendungsszenarien gibt es für Fake und Stubbing beim C++-Unit-Testen?

Welche Anwendungsszenarien gibt es für Fake und Stubbing beim C++-Unit-Testen?

PHPz
PHPzOriginal
2024-04-23 14:39:01651Durchsuche

Bei Unit-Tests werden Fakes und Stubs verwendet, um eine Testisolation zu erstellen: Fakes: Simulieren Sie die zu testende Einheit, steuern Sie das Verhalten und überprüfen Sie Interaktionen. Sie werden verwendet, um externe oder schwer zu testende Abhängigkeiten zu ersetzen. Stub: Eine spezielle gefälschte, simulierte Funktion oder Methode, die immer einen festen Wert zurückgibt oder eine bestimmte Aktion ausführt und verwendet wird, um zeitaufwändige oder instabile Abhängigkeiten zu ersetzen.

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

Verwendungsszenarien von Fake und Stubbing in C++-Unit-Tests

Bei Unit-Tests sind Fake und Stubbing zwei leistungsstarke Techniken zum Erstellen von Testisolationsumgebungen. Sie ermöglichen es Testentwicklern, spezifischen Code zu testen, ohne auf andere Komponenten angewiesen zu sein.

Mock

Mock ist die Erstellung einer simulierten Version des zu testenden Geräts, mit der Sie sein Verhalten steuern und seine Interaktionen überprüfen können. Fake wird häufig verwendet, um externe oder schwer zu testende Abhängigkeiten zu ersetzen.

Zum Beispiel:

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

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

In diesem Beispiel ist UserServiceMock eine Fälschung von UserService und wird verwendet, um das Verhalten von GetUser()-Methode, damit sie in Tests überprüft werden kann. <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 🎜🎜🎜Ein Stub ist eine spezielle Art von Fälschung, die eine Funktion oder Methode simuliert, die immer einen festen Wert zurückgibt oder eine bestimmte Aktion ausführt. Stubs werden häufig verwendet, um zeitaufwändige oder instabile Abhängigkeiten zu ersetzen. 🎜🎜🎜Beispiel: 🎜🎜rrreee🎜🎜Anwendungsfälle 🎜🎜🎜Fake und Stubs haben mehrere Anwendungsfälle in Unit-Tests, darunter: 🎜
  • Testen von Interaktionen mit externen Abhängigkeiten.
  • Isolieren Sie Vorgänge, die schwierig oder zeitaufwändig sind.
  • Überprüfen Sie die Reihenfolge der Parameterübergabe und Funktionsaufrufe.
  • Testen Sie die Fehlerbehandlung und Ausnahmebedingungen.
🎜🎜Praktischer Fall🎜🎜🎜Angenommen, wir haben eine Funktion, die den Benutzer von UserService abruft und das Passwort des Benutzers in der Datenbank aktualisiert: 🎜rrreee🎜Wir können eine Einheit erstellen Testfall: Verwenden Sie UserServiceMock, um UserService zu fälschen und das korrekte Verhalten der Funktion zu überprüfen: 🎜rrreee🎜In diesem Testfall stellen wir sicher, dass GetUser() code> ist Es wurde einmal aufgerufen und der erwartete Benutzer wurde zurückgegeben. Wir stellen dann sicher, dass das Passwort des Benutzers korrekt aktualisiert wurde. 🎜

Das obige ist der detaillierte Inhalt vonWelche Anwendungsszenarien gibt es für Fake und Stubbing beim C++-Unit-Testen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn