0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

「テスト駆動開発」を読んでPHPで写経した

0
Posted at

PHPの写経コードはこちら

感想

テストコードかくのおもしろい。「編集して祈る」日々を送っていたので「保護して変更する」安心感すごい。だいすき。もっといろんなパターンのテスト書けるようになりたい。

忘れずにしたいメモ

テスティングパターン

Mock Objectパターン

準備に手間がかかるリソースに依存したオブジェクトをテストするために、決められた結果を返す偽物のオブジェクトを代わりに作成する。テストファイル内で対象のオブジェクトをオーバーライドするもよし、Mock Objectフレームワーク1を使うもよし。

本書ではMock objectを重いリソースの代替として紹介している2が、オブジェクト指向言語とMock objectを組み合わせると設計が決まっていないところやわかっていないところにもテストコードが書ける という考え方3もある。

Self Shuntパターン

オブジェクト(A)がほかのオブジェクト(B)ときちんとやりとりしていることをテストしたいとき、Bの振る舞いをAに移してテストする。インターフェースを作るもよし、ブラックボックスにしてもよし。

Log Stringパターン

正しい順序でメソッド呼び出しが行われていることをテストしたいとき、記録用文字列を作り、メソッド呼び出しのたびにその文字列に追記する。

Crash Test dummyパターン

エラー処理部分のコードをテストするとき、例外を発生させる特別なオブジェクトを使う。try-catchでもよし、アノテーション4を使ってもよし、xUnitに搭載されているメソッド5を使ってもよし。

テストからわかる悪い設計の兆候

前準備に要するコードが長い

テスト対象オブジェクトの準備に100行のコードが必要なのであれば、そのオブジェクトは大きすぎるので分割する方がよい。

前準備コードの重複

共通の前準備コードを配置する場所が見つからないのは、互いに密に関連しあうオブジェクトが多すぎることを示唆している。

テスト実行時間が長い

実行に10分以上かかるテストスイートはよくない。

脆いテスト

思わぬタイミングで失敗するテストは、アプリケーションのどこかが意外な形で他の部分に影響している可能性を示唆している。2つの部分の関係性を断つか、または統合するなどして、離れた箇所からの影響を排除するように設計しなおさなければならない。

  1. PHPだとMockeryやPhakeがある。PHPUnitにも標準搭載されている。 ↩

  2. デトロイト学派(DetroitSchool)あるいは古典的TDD(ClassicalTDD)と呼ばれる。 ↩

  3. ロンドン学派(LondonSchool)あるいはモック主義TDD(MockingTDD)と呼ばれる。 ↩

  4. PHPUnitなら@expectedExceptionなど。PHPUnitで使えるアノテーションの一覧はこちら。 ↩

  5. PHPUnitなら$this->expectException()など。詳しくはこちら。 ↩

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?