- プログラムの動作をテストするコード
- 既存のソースコードを変更した際、動作確認が必要となるが、手作業と目視で毎回確認するのはコストがかかる
- 人間は間違えたり見落としたり、サボったりするから
- Delphiをインストールしたら付属してくるのですぐ使える
- XE8からDUnitXというのになったらしい。以前はDUnit
- 開発者は手元で実行する
- 環境依存の問題があるかもしれないので、CIサーバー(ビルドサーバー)などでも実行するとよい
- Jenkins
- rsvars.batを実行してからMSBuildでビルドする
- DUnitXの場合は、NUnit形式の結果を出力しておいて集計する
- NUnitプラグイン
- Jenkins
- コストはかかります
- 手作業で動作確認するコストをテストコード記述に使う
- いきなり全部のテストコードを書かなくてもいい
- 変更によって壊れたら困る重要な部分から書くとか
- 書きやすいところから書くとか
- 手作業で確認している内容をテストコードにする
- 業務ロジックのテスト
- 業務ロジック=データの操作
- UIから業務ロジックを分離する
- UIは業務ロジック呼び出し
- 業務ロジック側はUIに依存しない
- UIへフィードバックが必要なら、フックポイントを用意するかイベント通知の仕組みを入れる
- どうして書くのが難しいか、切り分ける
- モジュール設計や抽象化に失敗している
- モジュールやクラス間の依存を意識した設計にする
- 依存はコンストラクタで渡す
- コンストラクタの引数が増えすぎ
- 抽象化がうまくできてない可能性
- デザインパターンを使って解決できないか模索する
- コンストラクタの引数が増えすぎ
- 非同期処理はテストコードを書くのが大変なので、モックを使ったりしてがんばるしかない
- UIのテストは大変
- 変更があるとテストコードの修正も大変
- テストコードのメンテコストが高くなる
- 変更があるとテストコードの修正も大変
- モジュール設計や抽象化に失敗している
- スタブ
- テストしたい内容とは関係ない部分に仮で入れておくオブジェクトやデータ
- モック
- テストのためにオブジェクトや動作を置き換える
- 外部通信やI/Oなど
- テストのためにオブジェクトや動作を置き換える
- DependencyInjection(DI)という概念
- 決め打ちされたクラスはモックしづらい
- 強い依存関係がある状態
- DIコンテナを経由してインスタンスをやりとりする、インターフェースによってつなぐことで依存を弱くする
- 強い依存関係がある状態
- 引数をパスしていくのが冗長すぎる問題
- A <- B <- C のように3階層包含関係のあるオブジェクトで、Aが持つ値をCが参照したい場合
- 中間のBは特に利用しないのにAからCに値を渡すコードが必要となる
- 強い依存関係ができてしまう
- DIコンテナを経由してやりとりすることで、値を渡すだけのコードを減らす
- 強い依存関係ができてしまう
- 中間のBは特に利用しないのにAからCに値を渡すコードが必要となる
- A <- B <- C のように3階層包含関係のあるオブジェクトで、Aが持つ値をCが参照したい場合
- Spring4D
- DIコンテナを含んでいる
- Spring.Container.TContainer
- 決め打ちされたクラスはモックしづらい