Google TestのASSERT_EQとEXPECT_EQの違い

普段C++のユニットテストはGoogle Testを使って書くことが多いのですが、ちょっと時間が空くと諸々仕様忘れて同じこと何回も調べなおしてる気がするので、自分がちょいちょいハマる仕様を順次残していこうかと思います。

ASSERT_*とEXPECT_*の違い

Google Testでは2つの値を比較する方法に、ASSERT_*を使う方法とEXPECT_*を使う方法の2種類あります。この2つの違いをまとめていきます。

ASSERT_*

ASSERT_*は比較結果が意図しないものの場合、そのテストはそこで強制終了してしまいます。

文章で説明するより、コメント付きのコードを示した方がわかりやすいので、以下にサンプルコードを貼っておきます。

#include <gtest/gtest.h>

TEST(SampleTest, assertTest) {
	// ASSERT_*はこけたらそこで強制終了する
	ASSERT_FALSE(true);  // この比較でこけるのでここでこのテストを強制終了する
	ASSERT_TRUE(true);   // ↑で強制終了されるのでこの比較は実行されない
}

つまり、ASSERT_*を利用してテストが途中でこけると、最後までテスト内容を実行しません。

EXPECT_*

EXPECT_*は比較結果が意図しないものでも、強制終了させずに最後までテストを実行します。

以下、サンプルコードです。

#include <gtest/gtest.h>

TEST(SampleTest, expectTest) {
	// EXPECT_*はこけても最後まで処理は走る
	EXPECT_FALSE(true);  // この比較はこけるけど強制終了はしない
	EXPECT_TRUE(true);   // ↑で強制終了されないのでこの比較も実行される
}

つまり、EXPECT_*を使うと基本的には最後までテストを実行します。

使い分け

2つの違いはわかったものの、ではASSERT_*EXPECT_*のどちらを使うべきなのでしょうか。

公式ドキュメント的には、通常はEXPECT_*を使うことが推奨されています。一度のテスト実行で複数のバグを見つけることが可能だからです。

一方で、ある比較が失敗したときに、後続の処理を行っても意味のないようなときは、ASSERT_*を使う方が良いようです。

結局のメリデメを知った上で状況によって使い分けましょうということですね。

参考:

google/googletest
Googletest - Google Testing and Mocking Framework. Contribute to google/googletest development by creating an account on GitHub.
TotT: EXPECT vs. ASSERT
Because the Google C++ Testing Framework was opensourced last week, there will be episodes focusing on it published here in the future. Wa...

コメント