プロが教える店舗&オフィスのセキュリティ対策術

C++言語でprivateのメンバ関数をテストする場合
どのようにテストすればよろしいでしょうか

privateな関数は同じクラスしか呼ぶことができないため
テスト用コードから使用することができません

その関数を持つクラスにテスト用のpublicな関数を実装して
それをテスト用コードから呼び出すことはできますが
クラス本体にテスト用のコードを書かないで
privateな関数をテストする方法はありますか

A 回答 (4件)

>現在、ハッシュ計算のようなそのクラスの中だけで使用する関数がprivateであり


>これのアルゴリズムが正しいかテストしたいのです
>値の計算にはクラスのメンバも使用するため
>そのクラス外部に切り出すことができません
なぜ、できないのでしょうか?
自分で実装を変えられるならば、外部に切り出すことができないということはありえないはずですが。
メンバに依存しないように分離すればよいだけのことです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

思わす吹き出してしまいました(笑)

お礼日時:2014/12/04 23:10

自分も色々と悩みましたが、結論は「private 関数はテスト対象にしないほうが良い」ということに落ち着きました。


private 関数は public なインターフェースの実装上の都合によって存在するものなので、仕様が安定せず、テストコードが書けないからです。
もし仕様を安定化できるならば、private 関数にせず別のクラスの public 関数として分離したほうが良いです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

なるほど
privateな関数はテストしないという方針もありますね

現在、ハッシュ計算のようなそのクラスの中だけで使用する関数がprivateであり
これのアルゴリズムが正しいかテストしたいのです
値の計算にはクラスのメンバも使用するため
そのクラス外部に切り出すことができません

この場合どのようにテストすればよろしいでしょうか

# 市場にはprivateなメンバをテストできる有償のツールもあるようですが
# 数十万円~するので用意することが難しいです

お礼日時:2014/12/01 21:16

そのクラス自体を実装しているときなど、クラス外のテストプログラムからprivateメンバを書き出したいときなどあると思います。


自分は、コーディング段階では「public」のところを「private」に変えておいて、完成してから「private」に戻してますが、いかがでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます

publicのところをprivateに変えると
本来、クラス外部から呼ぶところも外部から呼べなくなってしまいますが
テストは実装クラス本体に記述する、ということでしょうか

置き換える件については
privateやprotectedを直接使用せず、
MY_PRIVATEやMY_PROTECTEDのようなマクロを作成しておき
テストの時はpublic、リリース時はそれぞれ本来のアクセス修飾子に置換されるようにしたこともありますが
この方法はテストのためのコードを埋め込むことになるので他の方法も探しています
(どうしても方法が見つからなければ、friendクラスや上記マクロを使用する予定です)

お礼日時:2014/12/01 21:11

privateメンバ関数を持つクラスで、テストコードのクラスあるいは関数をfriendとして宣言しておく。


それもできないようなら、そのprivateメンバを直接テストできる必要がないか、設計が間違っている。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

> privateメンバ関数を持つクラスで、テストコードのクラスあるいは関数をfriendとして宣言しておく。

つまり「本来の実装にテストに関連するコードを埋めこむ」ということですね

テスト用のコードを埋め込まない方法は何かありませんか

お礼日時:2014/12/01 21:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!