質問: <前提> C#プロジェクトの単体テストコード作成を行っています。 単体テストはMSTestで行っています。 テスト対象関数が呼び出す関数は、Mockクラス使用で関数処理差し替えをしています。 Mock使用では、public以外のクラス、関数やvirtual修飾子無しでは差し替えることができないため、テスト対象関数名などのシンボル定義名の場合のみに制限を掛けるなどして、修飾子切り替えなどを行っています。 例) ●テスト対象関数 ``` public void Method1(){} ``` ●テスト対象関数が呼び出す関数 ``` #if TEST_METHOD1 public virtual void Method2() #else private void Method2() #endif {} ``` Method1がテスト対象関数の場合のみ、条件付きコンパイルシンボルにTEST_METHOD1を入れてリビルドしてテストを実行します。 そのほか、関数内で別クラスのインスタンスを生成して使用するような動作をする関数テストでは、インスタンス生成対象のクラスにユニットテスト用クラスを作り、関数修飾子と同様にシンボル定義でクラスや実行結果を切り替えるようにしています。 <質問内容> テスト手順の削減を行う方法は何かないでしょうか? 今のテスト手順が「条件付きコンパイルシンボル変更」⇒「ビルド」⇒「テスト実行」と、手順が多いほか、1回実行でテストケースの全網羅ができません。 Stub、Shimなどは見かけたのですが、Visual StudioのProfessionalは対象外だそうなので、検討が行き詰ってしまっております。 <補足情報> プロジェクトのクラスに一律インターフェースを設けてデリゲートで、という方法案は調査していて見つかりました。 ただ、実処理コードは一旦完成の位置づけとなり、テストで困っているから構造見直しからやり直す、というのは作業期間や客先再レビューが困難なため、対応は見送りとしています。 実処理コード側のクラスファイルの編集については、既存の#ifなどによる修飾子切り替え処理を変更・削除するくらいが許容されます。 <開発環境> ・.Net Framework 4.6 ・Visual Studio 2015 Professional
回答: > > ただ、実処理コードは一旦完成の位置づけとなり、テストで困っているから構造見直しからやり直す、というのは作業期間や客先再レビューが困難なため、対応は見送りとしています。 > > 実処理コード側のクラスファイルの編集については、既存の#ifなどによる修飾子切り替え処理を変更・削除するくらいが許容されます。 > > > 完成したならテストしなくていいのでは? 保守するなら書き換えていいのでは? 内容や納期次第では方法がいくつか考えられますが、時間もなく、どこまで手を入れていいかもわからず、コードも闇の中の状態でどうにかしろと言われても困ります。#if でどうにかなっているのならそれでいいんじゃないでしょうか。もうそんな頻繁にテストしないでしょう?