0

多くのステップで構成される複雑なアルゴリズムの ut を作成することを考えました。たとえば、以下のようなアルゴリズム クラス。そして、すべてのステップをテストしたいと思います。しかし、プライベート関数を処理できることは明らかです。Google gtest を使用しています。

UT をどのように設計しますか?

Class Algorithm
{private:
    PreProcess();
    Process();
    PostProcess();
}
4

1 に答える 1

2

Google Test のドキュメントには、プライベート コードのテストを扱う特定のセクションがあります。

短いバージョンは、非公開関数のテストを避けるようにしてください。必要に応じて、クラスの設計を変更するか、テストをクラスのフレンドにすることができます。

GTest は、この最後のオプションのヘルパー マクロを提供します:FRIEND_TESTが、これに関する名前空間の問題に注意してください。このマクロを機能させるには、テスト対象のクラスと同じ名前空間でテストを定義する必要があります。

次のようなものです:

#include <iostream>
#include "gtest/gtest.h"

class Algorithm {
 private:
  bool PreProcess() { std::cout << "Pre\n"; return true; }
  bool Process() { std::cout << "Process\n"; return true; }
  bool PostProcess() { std::cout << "Post\n"; return true; }
  FRIEND_TEST(AlgorithmPrivateTest, PreProcess);
  FRIEND_TEST(AlgorithmPrivateTest, Process);
  FRIEND_TEST(AlgorithmPrivateTest, PostProcess);
};

class AlgorithmPrivateTest : public testing::Test {
 protected:
  AlgorithmPrivateTest() : algorithm_() {}
  Algorithm algorithm_;
};

TEST_F(AlgorithmPrivateTest, PreProcess) {
  EXPECT_TRUE(algorithm_.PreProcess());
}

TEST_F(AlgorithmPrivateTest, Process) {
  EXPECT_TRUE(algorithm_.Process());
}

TEST_F(AlgorithmPrivateTest, PostProcess) {
  EXPECT_TRUE(algorithm_.PostProcess());
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
于 2013-02-02T13:10:54.587 に答える