SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Google製のC++ Unit Test Framework「Google Test」を使ってみる

ASSERT_?とEXPECT_?

 googletestが用意してくれている検証マクロ:ASSERT_?とEXPECT_?の一覧を以下に示します。

検証マクロの一覧
  ASSERT/EXPECT 説明
例外 {ASSERT|EXPECT}_THROW(statement,expected_exception) statementがexpected_exceptionをthrowする
{ASSERT|EXPECT}_NO_THROW(statement) statementはいかなる例外もthrowしない
{ASSERT|EXPECT}_ANY_THROW(statement) statementは何らかの例外をthrowする
整数の比較 {ASSERT|EXPECT}_EQ(expected,actual) expected == actual
{ASSERT|EXPECT}_NE(v1,v2) v1 == v2
{ASSERT|EXPECT}_LT(v1,v2) v1 < v2
{ASSERT|EXPECT}_LE(v1,v2) v1 <= v2
{ASSERT|EXPECT}_GT(v1,v2) v1 > v2
{ASSERT|EXPECT}_GE(v1,v2) v1 >= v2
実数の比較 {ASSERT|EXPECT}_FLOAT_EQ(f1,f2) f1 == f2(floatの比較)
{ASSERT|EXPECT}_DOUBLE_EQ(d1,d2) d1 == d2(doubleの比較)
{ASSERT|EXPECT}_NEAR(r1,r2,err) |r1 - r2| < err
文字列の比較 {ASSERT|EXPECT}_STREQ(s1,s2) s1 と s2 は等しい
{ASSERT|EXPECT}_STRNE(s1,s2) s1 と s2 は等しくない
{ASSERT|EXPECT}_STRCASEEQ(s1,s2) s1 と s2 は等しい(大文字/小文字を区別しない)
{ASSERT|EXPECT}_STRCASENE(s1,s2) s1 と s2 は等しくない(大文字/小文字を区別しない)
Windows-API {ASSERT|EXPECT}_HRESULT_SUCCEEDED(expr) exprがSuccessを返す
{ASSERT|EXPECT}_HRESULT_FAILED(expr) exprがFailを返す
bool {ASSERT|EXPECT}_TRUE(condition) conditionが真
{ASSERT|EXPECT}_FALSE(condition) conditionが偽

 ASSERT_?とEXPECT_?の違いですけど、ASSERT_?はEXPECT_?に比べより重要な検証、つまり、失敗するとそれ以降テスト不能もしくはテスト結果に意味がなくなる場合がASSERT_?です。ASSERT_?で失敗すると以降に続くテストを端折って脱出します。

list-05 assert_expect.cpp
#include <gtest/gtest.h>

TEST(difference,assert) {
  for ( int i = -3; i < 4; ++i ) {
    ASSERT_GT(0,i);
  }
}

TEST(difference,expect) {
  for ( int i = -3; i < 4; ++i ) {
    EXPECT_GT(0,i);
  }
}

 このテストを実行した結果がコレ:

 ASSERT_?では一度の失敗で終わっているのに対し、EXPECT_?は失敗しても処理を続行しています。

 もう一つ、{ASSERT|EXPECT}_FLOAT_EQ, {ASSERT|EXPECT}_DOUBLE_EQはそれぞれ2つのfloat/double値が等しいことを検証します。が、実数演算では誤差がつきものなので単にr1 == r2では多くの場合失敗します。この2つはほんの少しの違いであれば等値とみなします。有効桁数の末尾で多少異なる程度なら等値扱いのようです。もっと幅を持たせた比較は{ASSERT|EXPECT}_NEARの第3引数に許容誤差を与えて検証します。

list-06 real_tolerance.cpp
// 実行してみてね!
#include <iostream> // cout, endl
#include <cfloat> // {FLT|DBL}_EPSILON

#include <gtest/gtest.h>

TEST(tolerance,floatEQ) {
  for ( int i = -6; i < 7; ++i ) {
    std::cout << "i=" << i << std::endl;
    EXPECT_FLOAT_EQ(1.0f, 1.0f+FLT_EPSILON*i);
  }
}

TEST(tolerance,doubleEQ) {
  for ( int i = -6; i < 7; ++i ) {
    std::cout << "i=" << i << std::endl;
    EXPECT_DOUBLE_EQ(1.0, 1.0+DBL_EPSILON*i);
  }
}

TEST(tolerance,NEAR) {
  for ( int i = -6; i < 7; ++i ) {
    std::cout << "i=" << i << std::endl;
    EXPECT_NEAR(1.0, 1.0+0.1*i, 0.4);
  }
}

次のページ
2:フィクスチャによる前準備と後始末

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6656 2012/08/02 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー