- 締切済み
privateなメンバ関数をテストする方法
C++言語でprivateのメンバ関数をテストする場合 どのようにテストすればよろしいでしょうか privateな関数は同じクラスしか呼ぶことができないため テスト用コードから使用することができません その関数を持つクラスにテスト用のpublicな関数を実装して それをテスト用コードから呼び出すことはできますが クラス本体にテスト用のコードを書かないで privateな関数をテストする方法はありますか
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- myuki1232
- ベストアンサー率57% (97/170)
>現在、ハッシュ計算のようなそのクラスの中だけで使用する関数がprivateであり >これのアルゴリズムが正しいかテストしたいのです >値の計算にはクラスのメンバも使用するため >そのクラス外部に切り出すことができません なぜ、できないのでしょうか? 自分で実装を変えられるならば、外部に切り出すことができないということはありえないはずですが。 メンバに依存しないように分離すればよいだけのことです。
- myuki1232
- ベストアンサー率57% (97/170)
自分も色々と悩みましたが、結論は「private 関数はテスト対象にしないほうが良い」ということに落ち着きました。 private 関数は public なインターフェースの実装上の都合によって存在するものなので、仕様が安定せず、テストコードが書けないからです。 もし仕様を安定化できるならば、private 関数にせず別のクラスの public 関数として分離したほうが良いです。
お礼
回答ありがとうございます なるほど privateな関数はテストしないという方針もありますね 現在、ハッシュ計算のようなそのクラスの中だけで使用する関数がprivateであり これのアルゴリズムが正しいかテストしたいのです 値の計算にはクラスのメンバも使用するため そのクラス外部に切り出すことができません この場合どのようにテストすればよろしいでしょうか # 市場にはprivateなメンバをテストできる有償のツールもあるようですが # 数十万円~するので用意することが難しいです
- titeiking2014
- ベストアンサー率25% (8/31)
そのクラス自体を実装しているときなど、クラス外のテストプログラムからprivateメンバを書き出したいときなどあると思います。 自分は、コーディング段階では「public」のところを「private」に変えておいて、完成してから「private」に戻してますが、いかがでしょうか?
お礼
回答ありがとうございます publicのところをprivateに変えると 本来、クラス外部から呼ぶところも外部から呼べなくなってしまいますが テストは実装クラス本体に記述する、ということでしょうか 置き換える件については privateやprotectedを直接使用せず、 MY_PRIVATEやMY_PROTECTEDのようなマクロを作成しておき テストの時はpublic、リリース時はそれぞれ本来のアクセス修飾子に置換されるようにしたこともありますが この方法はテストのためのコードを埋め込むことになるので他の方法も探しています (どうしても方法が見つからなければ、friendクラスや上記マクロを使用する予定です)
- rinkun
- ベストアンサー率44% (706/1571)
privateメンバ関数を持つクラスで、テストコードのクラスあるいは関数をfriendとして宣言しておく。 それもできないようなら、そのprivateメンバを直接テストできる必要がないか、設計が間違っている。
お礼
回答ありがとうございます > privateメンバ関数を持つクラスで、テストコードのクラスあるいは関数をfriendとして宣言しておく。 つまり「本来の実装にテストに関連するコードを埋めこむ」ということですね テスト用のコードを埋め込まない方法は何かありませんか
お礼
回答ありがとうございます 思わす吹き出してしまいました(笑)