C++相談室 part146
レス数が1000を超えています。これ以上書き込みはできません。
プライベートメンバの単体テストってみんなどうしてるのかな。 #if 0
friend test;
#endif #ifndef NDEBUG
friend struct test;
#endif namespace Method{ namespace Detail {
template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{};
} }
// 文字列で呼び出すための関数を登録するためのマクロ
#define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \
namespace Method { namespace Detail { \
template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \
using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \
MethodRegister() { \
MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \
} \
~MethodRegister() { \
MethodContainer::GetInstance().Unregister( #FUNC ); \
} \
}; \
static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \
} }
void HOGE(){
std::cout << "Hello World!" << std::endl;
}
void HOGE( std::string text ){
std::cout << text << std::endl;
}
METHOD_REGISTER_METHOD( HOGE, void );
METHOD_REGISTER_METHOD( HOGE, void, std::string );
こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、
関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等
多数の問題が出て詰まってしまいました。
こういった問題を対処するにはどうすればよいのでしょうか? >>966
>>967
リリース時に消す必要あんの? >>963
まあ、
({int r; while((r = index(n)) == 0) n--; r;})
の最後の
r;
というのが限りなく非文法的ですし プライベートメンバをテストしたくなったらそのロジックのみを非メンバ関数に切り出してテストしてるな。
まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。 templateでアクセスすると合法的にプライベートメンバにアクセスできる テストのテストが必要になるような意味のわからないテストコードはアウト
テストコードは実行せずに人が読んで理解できなければいけない >>978
どんな感じか見せていただけないでしょうか。 >>971
絶対必要でもないが
少なくともデバッグ用であることくらい
アピールしたい
//よりNDEBUGという特定ワードを使う点にも拘りがある >>979
例えばテストコードの中にループや条件分岐があるようなものはアウト ループは許してもらえませんか?
データの並びとか検査したいんで。
条件分岐はたぶんないと思います。 テスト用にいろんな複雑なテストも入れてるけど
まずいのか? Debugビルドしたら遅すぎて検証できなくて詰んだ 典型的な糞テストは、テスト対象の出力がハッシュや現在時刻などのような予測しづらいものに依存している場合に、
テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな
原則的には、期待する出力は全てハードコードするのが正しい
難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ >>982
Parameterized Testsがあれば十分じゃね? >>986
期待する出力をハードコードするから
テストで「○○以上であること」って書くこと無いよね?
こういうテストケースある?言い換えるとそういうマッチャーって必要? >>987
それはまた別の話
ここで言ってるのは単体テストレベルの話だぞ クラスとかの勉強入る前にC言語でしっかり文字列処理出来るようになったほうがいい? >>995
strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK. C言語でしっかり文字列処理出来るようになったほうがいい? → いい
C++でC言語の文字列処理する? → しない >>987
逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。 単体テストはどんだけ単純でわかりやすいコードでテストパターンを網羅するかが肝
Google TestとかTest::MoreとかJUnit使ったらワカル このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 41日 12時間 33分 22秒 レス数が1000を超えています。これ以上書き込みはできません。