私は15年間ウェブサイトプログラミングを行っており、PHPは過去5年ほどです。私は常に堅実なコードを書いています。しかし、私には80%を主張しているクライアントがいます。単体テスト中のコード。クライアントは常に正しいので、PHP_CodeSnifferを使用してコードが正しく表示されることを確認し、PHPUnitを使用して単体テストを行うことを計画しています。この経験を通じて何かを学びたいと思っています。
これらは使用するのに適切なツールですか? PHPUnitのセットアップと追加コードの記述にはどのくらいの時間がかかりますか?過去と同じように、ウェブページを作成してセルフテストを行うには、約8週間かかるはずです。ユニットテスト(PHPUnit)に4日(10%)を追加した場合、それで十分ですか?考え?提案?ありがとう。
一行で:それはあなたがどのように働くかに依存します。正直なところ、10%は少なすぎると思います。それは、40%ではないにしても少なくとも25%、60%ではないにしてもそれ以上ではないはずです。
まず、私はあなたのクライアントに非常に同意します。単体テストは、堅牢で、保守が容易で、デバッグが容易な製品の重要な部分です。
私が知っていることから話します。私はほとんどのプロジェクトでTDD(テスト駆動開発)を使用しています。 TDDは基本的に、実際のコードの前にテストを記述させます。それらは、最終製品が満たす必要のある一連の受け入れ基準を確立します。通常、テストの作成には50%から70%の時間を費やし、残りはテストに合格するためのコードの実装に費やします。
ばかげている、または巨大に聞こえるかもしれませんが、そうではないことを保証できます。理由は次のとおりです。
PHPUnitは、PHPのユニットテスト用の事実上のツールであり、非常に優れています。私はPHP_CodeSnifferをあまり使用していません。ただ、一人で仕事をしているのなら、おそらく必要ないと思います。チームでは、誰がコーディングしたかに関係なく、コードが同じように見えることを確認する方が便利です。
あなたがこの経験から何かを学ぶという態度を持っていることに対するあなたへの小道具。きっとそうなるでしょう。
最初に学ぶべきことは、ユニットテストの必要性はあなたの経験とは何の関係もないということです。最高の開発者は、最高のユニットテスターの1人にもなります。
Bill Venners:あなたはあなたの本の中でリファクタリング: "リファクタリングしたいのなら、本質的な前提条件はしっかりしたテストをすることです。 「それは、テストがない場合はリファクタリングすべきではないという意味ですか?
マーティン・ファウラー:ネットなしで綱渡りをしていると考えるべきです。綱渡りが上手で、それほど高くない場合は、試してみてください。しかし、これまで綱渡りをしたことがなく、ナイアガラの滝を越えている場合は、おそらく良いネットが必要です。
から http://www.artima.com/intv/refactorP.html
私はユニットテストなしでPHPを書いていました。その後、Javaでユニットテストを何年も練習した後、ユニットテストなしではPHPの単一ページよりもはるかに複雑なものに取り組むことができないことに気付きました。理由? 生産性。ユニットテストなしでは、自信を持ってリファクタリングすることはできませんでした。つまり、A)のどちらかを、最初からさらに分解してすべてを処理する必要がありました。繰り返しますが、またはB)、私は醜いレガシーコードを処理する必要があります。
あなたが入札をしているとき、あなたはテストする時間を考慮する必要がありますか? はい。それにはもっと時間がかかると直感的に思えますか? はい、もう一度。他のいくつかの回答が大まかに見積もっているように、おそらく、単体テストがない場合よりも50-100%大きく見積もる必要があります。
しかし!...
その結果、見積もりはより正確になります。 1時間ごとに請求すると、クライアントにさらに印象を与え、料金を引き上げることができます。定額料金を請求すると、1時間あたりの収益が増えます。
テストを行わないと、見積もりはおそらくクラップスになります。バグ、変更要求、および再定義はすべて、正確に見積もるにはひどいものです。テストは、3つすべての影響を最小限に抑えるための鍵です。
どれくらい時間がかかるかについての簡単な答えはありません。
しかし、基本的なルールとして、それが短いプロジェクトである場合:優れた単体テストを伴う開発は、単体テストを使用しない開発の1.75〜2倍の時間がかかると思います。より長いプロジェクトの場合、おそらく25〜30%ですか?
ユニットテストを行うことをお勧めします前コードを記述します。このように考えると、単体テストの足場を構築することは実際には設計プロセスの一部になるため、単体テストに時間を費やしていると考えるべきではなく、単体テストの構築が設計に役立っていると考えるべきです。優れた製品と、ビルド後にそのテストが存在することで、その状態を維持することが容易になります。最初に単体テストを作成する必要があることは、実際の要件に焦点を合わせるのに役立ち、完了したかどうかをテストする明確な方法を提供し(単体テストに合格)、「早期にテストして頻繁にテストする」のに役立ちます。
PHPUnitについては……使ってから久しぶりですが、パワフルな印象ですが、磨きをかけるにはもう少し作業が必要かもしれません。
ただし、ここで伝えたいことが1つあるとすれば、プロジェクトの最後にユニットテストを単なる形式的なものと見なさないでください。それだけだとしたら、私の意見では、それは無価値です。
これまでの答えは非常に徹底しているので、カバーされていない点を1つ追加します。PHPUnitを使用することによる余分な時間は
プレゼンテーションを扱わないユニットテストモデルクラスは非常に簡単です。クラスごとにテストを作成します。これらのテストケースでは、特定のメソッド/機能をテストするためにオブジェクトを直接インスタンス化して構成できます。 PHPUnitをセットアップして実行すると、これらのテストをすばやく機能させることができます。
Webページの単体テストはもっと難しい場合があります。 Zend Framework、Symfony、Smarty、またはその他のMVCエンジンを使用している場合、PHPUnitをそれらとうまく連携させるにはさらに時間がかかる可能性があります。 Zend Frameworkを使用しており、コントローラーとビュースクリプトを分離してテストするための基本クラスの構築にかなりの時間を費やしました。このプロジェクトのサイズを考えると、おそらくControllerTestCase
から始めたほうがよいでしょう。