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_?で失敗すると以降に続くテストを端折って脱出します。
#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引数に許容誤差を与えて検証します。
// 実行してみてね!
#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);
}
}

