catchしたらテストOK。catchせず通る、もしくは想定した例外以外が投げられたらテスト失敗とする。
try {
();
f(false);
TEST}
catch (target_exception&) {
(true);
TEST}
catch (...) {
(false);
TEST}
Comparing Floating Point Numbers, 2012 Edition
テスト用のディレクトリをリポジトリに登録する場合、バージョン管理システムの管理ディレクトリが問題になる場合がある。
そのため、すべてのディレクトリを比較するのではなく、目的のディレクトリがすべて存在するかのチェックを行う。
testableなインタフェースのために、本来ブラックボックス化されるべきprivateインタフェースをpublicにしなければならない場合がある。
そういう設計を嫌う場合は、テスト用のクラスをfriend登録することができる。
class XTester;
class X {
int id;
std::string name;
friend XTester;
};
class XTester {
& x;
Xpublic:
(X& x) : x(x) {}
XTester
int get_id() const { return x.id; }
std::string get_name() const { return x.name; }
};
現在日時に依存するシステムはテストしにくい。
そのため、ライブラリによって提供される現在日の時取得関数を直接使用するのではなく、カスタマイゼーションポイントを用意し、ダミーの値をいつでも返せるようにしておくことで、testableにすることができる。
#ifdef DATE_TIME_CUSTOM_NOW_TIME
std::time_t now_time_t();
#else
inline std::time_t now_time_t()
{
std::time_t t;
std::time(&t);
return t;
}
#endif
#define DATE_TIME_CUSTOM_NOW_TIME
std::time_t now_time_t()
{
std::tm t;
.tm_year = 2010 - 1900;
t.tm_mon = 12 - 1;
t.tm_yday = 353;
t.tm_mday = 20;
t.tm_wday = 1;
t.tm_hour = 15;
t.tm_min = 30;
t.tm_sec = 45;
t.tm_isdst = 0;
t
return std::mktime(&t);
}