Google C++ユニットテストフレームワーク(Gtest)シリーズチュートリアルの2つ-断言、関数テスト

5592 ワード

引用する
『Google C++ユニットテストフレームワーク(Gtest)シリーズチュートリアルの1つ——入門』では、テストコードをコンパイルし、実行可能なファイルを生成する方法について説明しました.次に、Gtestがユニットテストコードの作成を容易にするために提供した文とフレームワークについて説明します.
断言する
1.アサーションタイプ
断言とは,条件が真であるか否かを判断する文であり,Gtestテストコードを構成する最も基本的な単位である.Gtestは私たちに2つのタイプの断言を提供しました.
  • ASSERT_*シリーズ、チェックポイントが失敗した場合、テスト関数を終了します.
  • EXPECT_*シリーズは、チェックポイントが失敗した場合、テスト関数を終了せずに続行します.

  • 私たちが断言文を使う場合、一般的にEXPECT_*を選びます.シリーズは、次の2つの理由に基づいています.
  • このシリーズの断言に失敗した場合、テスト関数が終了しない.この関数の後続のチェックポイントは実行される.
  • テスト関数には、メモリ申請とリリースの呼び出しが含まれる場合があります.ASSERT_*一連のブレークスルーにより、後続のメモリ解放呼び出しが実行されず、メモリ漏洩の問題が発生します.

  • 2.例
    断言判定に失敗した場合、Gtestはその断言が存在するソースファイルと行番号を印刷し、失敗した情報を与える.ブール値検査の例を見てみましょう.
    // IsPrime(int)           
    EXPECT_FALSE(IsPrime(1));
    // ...

    IsPrime(int)関数の実装に誤りがあり、1も素数とすると、テストの実行結果には次のようなヒントが含まれます.
    my_test.cc:15: Failure
    Value of: IsPrime(1)
    Actual: true
    Expected: false

    Gtestは、ブール値チェック、数値型データチェック、文字列チェックなど多くのチェックタイプを提供しています.これらのチェックタイプのより詳細な使用方法については、ここここを参照してください.
    テスト関数
    1.TEST()
    Gtestでは、マクロTEST()を使用してテスト関数を定義し、次のように使用します.
    TEST(test_case_name, test_name) {
    ... test body ...
    }

    ここでtest bodyは、任意の合法的なC++文および上記の断言文を含むことができる.
    TEST()の最初のパラメータは、テスト・インスタンスの名前です.2番目のパラメータは、テスト・インスタンスの名前です.2つのパラメータのネーミング文字は、C++の正当なフラグでなければなりません.下線""は含まれません.1つのテストのフルネームは、テスト・インスタンス名とテスト・インスタンス名から構成されます.
    2.例
    TEST()の使い方やtest_case_nameとtest_nameの違いは,TEST()を用いた例を示す.
    int Factorial(int n); // Returns the factorial of n

    Factorial(int n)が我々の被測定関数であると仮定すると,その機能はnの階乗であるnを返すことである!テスト関数は次のとおりです.
    // Tests factorial of 0.
    TEST(FactorialTest, HandlesZeroInput) {
    EXPECT_EQ(1, Factorial(0));
    }
    // Tests factorial of positive numbers.
    TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
    }

    FactorialTestは私たちのテスト用例の名前です.もちろん、テスト用例の名前は必ずしもXXXTestではありません.被験者を説明できればいいです.HandlesZeroInputとHandlePositiveInputはテストインスタンスの名前である.この2つのインスタンスはFactorialTestテストの例であり、テストインスタンスの名前を任意に設定することができるが、テスト機能を体現できるネーミング方式が好ましい.
    テストコードをコンパイルし、プログラムを実行します.実行結果は次のとおりです.
    Running main() from gtest_main.cc
    [==========] Running 2 tests from 1 test case.
    [----------] Global test environment set-up.
    [----------] 2 tests from FactorialTest
    [ RUN ] FactorialTest.HandlesZeroInput
    [ OK ] FactorialTest.HandlesZeroInput (0 ms)
    [ RUN ] FactorialTest.HandlesPositiveInput
    [ OK ] FactorialTest.HandlesPositiveInput (0 ms)
    [----------] 2 tests from FactorialTest (1 ms total)

    [----------] Global test environment tear-down
    [==========] 2 tests from 1 test case ran. (1 ms total)
    [ PASSED ] 2 tests.

    Gtestは、テストケース(TestCase)単位でテスト結果を出力していることがわかる.1つのテストケースには、その含まれるテストケース(Tests)、「テストケース名.テストケース名」は、FactorialTest.HandlesZeroInputのようなテスト(Test)の全称である.
    本文はGtestの断言とTEST()方法を紹介し、断言はGtestテストコードを構成する基本文である.TEST()は関数テストに使用でき、テスト例(TestCase)は複数のテストインスタンス(Tests)を含むことができ、この階層はあるテストオブジェクトの複数のテストインスタンスを管理するのに便利である.次のセクションでは、テストファームウェア(Test fixture)について説明します.Gtestがテスト例の符号化と管理を容易にする方法を示しているかを見てみましょう.)Reference:googletest project
                    《GoogleオープンソースC++ユニットテストフレームワークGoogle Testシリーズ(gtest)》 by CoderZh