Skip to content

Instantly share code, notes, and snippets.

@tokibito
Last active May 9, 2018 21:03
Show Gist options
  • Save tokibito/e4a1a3795100541582f0a3c9db3b042f to your computer and use it in GitHub Desktop.
Save tokibito/e4a1a3795100541582f0a3c9db3b042f to your computer and use it in GitHub Desktop.
Delphiとテストコードの話

テストコードの話

テストコードとは

  • プログラムの動作をテストするコード

どうしてテストコードが必要か

  • 既存のソースコードを変更した際、動作確認が必要となるが、手作業と目視で毎回確認するのはコストがかかる
  • 人間は間違えたり見落としたり、サボったりするから

DUnitXでテストコードを書く

  • Delphiをインストールしたら付属してくるのですぐ使える
    • XE8からDUnitXというのになったらしい。以前はDUnit

テストの実行はどうするか

  • 開発者は手元で実行する
  • 環境依存の問題があるかもしれないので、CIサーバー(ビルドサーバー)などでも実行するとよい
    • Jenkins
      • rsvars.batを実行してからMSBuildでビルドする
      • DUnitXの場合は、NUnit形式の結果を出力しておいて集計する
        • NUnitプラグイン

テストコードを書くコストが高くて...

  • コストはかかります
  • 手作業で動作確認するコストをテストコード記述に使う
  • いきなり全部のテストコードを書かなくてもいい
    • 変更によって壊れたら困る重要な部分から書くとか
    • 書きやすいところから書くとか

テストコードで何をテストしたらいいのか

  • 手作業で確認している内容をテストコードにする
  • 業務ロジックのテスト
    • 業務ロジック=データの操作
    • UIから業務ロジックを分離する
      • UIは業務ロジック呼び出し
      • 業務ロジック側はUIに依存しない
        • UIへフィードバックが必要なら、フックポイントを用意するかイベント通知の仕組みを入れる

テストコードを書くのが難しい

  • どうして書くのが難しいか、切り分ける
    • モジュール設計や抽象化に失敗している
      • モジュールやクラス間の依存を意識した設計にする
      • 依存はコンストラクタで渡す
        • コンストラクタの引数が増えすぎ
          • 抽象化がうまくできてない可能性
          • デザインパターンを使って解決できないか模索する
    • 非同期処理はテストコードを書くのが大変なので、モックを使ったりしてがんばるしかない
    • UIのテストは大変
      • 変更があるとテストコードの修正も大変
        • テストコードのメンテコストが高くなる

テストしづらい問題を解決する道具

  • スタブ
    • テストしたい内容とは関係ない部分に仮で入れておくオブジェクトやデータ
  • モック
    • テストのためにオブジェクトや動作を置き換える
      • 外部通信やI/Oなど
  • DependencyInjection(DI)という概念
    • 決め打ちされたクラスはモックしづらい
      • 強い依存関係がある状態
        • DIコンテナを経由してインスタンスをやりとりする、インターフェースによってつなぐことで依存を弱くする
    • 引数をパスしていくのが冗長すぎる問題
      • A <- B <- C のように3階層包含関係のあるオブジェクトで、Aが持つ値をCが参照したい場合
        • 中間のBは特に利用しないのにAからCに値を渡すコードが必要となる
          • 強い依存関係ができてしまう
            • DIコンテナを経由してやりとりすることで、値を渡すだけのコードを減らす
    • Spring4D
      • DIコンテナを含んでいる
      • Spring.Container.TContainer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment