PHPUnitで仕事を見積もるにはどうすればよいですか?


9

私は15年間Webサイトプログラミングを行っており、過去5年間はPHPを使用しています。私はいつもしっかりしたコードを書いてきました。ただし、ユニットテストされているコードの80%を主張しているクライアントがいます。クライアントは常に正しいので、PHP_CodeSnifferを使用してコードが正しく表示されることを確認し、PHPUnitでユニットテストを実行する予定です。この経験を通して何かを学びたいと思っています。

これらは使用に適したツールですか?PHPUnitのセットアップと追加コードの記述にどれくらいの時間がかかりますか?これまでと同じように、ウェブページを書いてセルフテストを行うのに約8週間かかります。ユニットテスト(PHPUnit)に4日(10%)を追加すると、それで十分ですか?考え?提案?ありがとう。


2
ユニットテストは開発時間を倍にすることができます。

PHP 2.0で作業しましたか?いいね!私の入力は、答えを出す資格がないので、要するに、imhoで正しいツールの選択についてです。参照してくださいPHPのテストフレームワーク上で私のテイクを私も知っていないとphpcsためにあらゆる選択肢を。追加する時間について:TDDをしばらく実行した後、私は通常それなしでは遅くなりますが、特定のことを始めたので、かなり長く(+ 50%)なりました。テストを困難にするフレームワーク(静的なものの多く)を使用する場合は、さらに追加します。
エドリア語2011年

1
これにより、初期の初期開発が増加しますが、8週間のプロジェクトでは、単体テストがバグをより早く簡単に発見するのに役立つため、プロジェクトの違いが少なくなることがわかります。
フェントン2009

1
@ドラゴン、ちょっと、でもユニットテストは開発をスピードアップします[デプロイ/テスト/検索\修正のサイクルが
はるかに少なくなり

回答:


7

一行で:それはあなたの働き方に依存します。正直なところ、10%は少なすぎると思います。少なくとも25%、40%でない場合、60%でない場合、それ以上ではないはずです。

まず、私はあなたのクライアントにとても同意します。単体テストは、堅牢で保守が容易でデバッグが容易な製品の重要な部分です。

私が知っていることから話します。私はほとんどのプロジェクトでTDD(テスト駆動開発)を使用しています。TDDは基本的に実際のコードの前にテストを記述させます。最終製品が満たす必要のある一連の許容基準を確立します。通常、テストの作成には50%から70%の時間を費やし、残りはテストをパスするためのコードを実装するために費やします。

ばかげたことや巨大なことのように聞こえるかもしれませんが、実際はそうではありません。理由は次のとおりです。

  • テストを作成するときに使用するのに最適なアーキテクチャパターンを特定できます。このようにして、コーディングを開始すると、アプリケーションアーキテクチャの変更は最小限に抑えられます(アプリケーションアーキテクチャをやり直すのはどれほどコストがかかるかを知っているためです)。
  • テストに合格するためだけにコーディングします(したがって、最終製品を受け入れ可能にします)。役に立たない/範囲外の機能のプログラミングに時間を費やすことはありません。
  • コードを少なくすることで(つまり、実際に必要なコードのみ)、エラーが発生しにくくなります。(コードが少ない=エラーが少ない)。
  • 間違えた場合、間違えた場合、なぜ問題があるのか​​、どこに問題があるのか​​を理解するのにかかる時間が大幅に短縮されます。テストが適切に記述されている場合は、1つの間違いが連鎖反応ではなく1つの失敗を引き起こすことを意味します。このようにして、数秒ではなくても数分で問題の原因を簡単に特定できます。
  • 単体テストで実際のコードを実装するのにかかる時間が大幅に短縮されます。テストが失敗するとすぐに、何かが間違っていることがわかります。バグを修正するためにクライアントと何度もやり取りする必要はありません。
  • エラーを100%キャッチできるものはないため、最終的にはクライアントとやり取りしてバグを修正する必要があります。ただし、95%以上なら簡単にキャッチできます。

PHPUnitは、PHPを単体テストするためのデファクトツールであり、非常に優れています。PHP_CodeSnifferをあまり使用していません。しかし、一人で作業しているなら、おそらくそれは必要ないと思います。誰がコーディングしたかに関係なく、コードが同じに見えることを確認することは、チームにとってより便利です。


5

この経験から何かを学ぶという態度を持っていることに対するあなたへの小道具。きっとそうなると思います。

あなたが最初に学ばなければならないことは、ユニットテストの必要性があなたがどれほど経験を積んでいるかとは何の関係もないということです。最高の開発者は、最高のユニットテスターの1人にもなります。

Bill Venners:あなたはあなたの本のリファクタリングでこう言っています:「リファクタリングしたいのなら、本質的な前提条件はしっかりしたテストを持っていることです。」つまり、テストがない場合はリファクタリングしてはいけないということですか?

マーティン・ファウラー:ネットなしで綱渡りをしていると考えるべきです。綱渡りが上手で、それほど高くない場合は、試してみるとよいでしょう。しかし、これまでに綱渡りをしたことがなく、ナイアガラの滝の上にある場合は、おそらく良い網が必要です。

http://www.artima.com/intv/refactorP.htmlから

以前は単体テストなしでPHPを作成していました。その後、何年にもわたってJavaでユニットテストを実践してきた結果、ユニットテストなしでは、PHPの単一ページよりもはるかに複雑な作業はできないことがわかりました。理由?生産性。単体テストがなければ、自信を持ってリファクタリングすることはできませんでした。つまり、A)さらに分解してすべてを最初からやり直さなければならないか、B)醜いレガシーコードを処理する必要がありました。

入札するときに、テストに時間をかける必要がありますか?はい。それはそれがかかることを直感的に思えるんより多くの時間を? はい、また。おそらく、他のいくつかの回答がおおよそ見積もったように、単体テストなしの場合よりも50〜100%高い見積りが必要になるでしょう。

しかしながら!...

  • 仕様の穴を先にキャッチして対処します
  • つまり、よりクリーンで堅固な仕様に開発することになります。
  • 仕様の変更に迅速かつ自信を持って対応できます
  • バグが減ります
  • バグはより早く簡単に修正されます

その結果、見積もりはより正確になります。時間単位で請求する場合、クライアントにさらに印象を与え、料金を上げることができます。定額で請求すると、1時間あたりの収益が増えます。

テストを行わない場合、推定はクラップシュートである可能性が高いです。バグ、変更管理、および再定義はすべて、正確に見積もるにはひどいものです。3つすべての影響を最小限に抑えるには、テストが重要です。


3

どれだけ長くかかるかについては簡単な答えはありません。

しかし基本原則として、それが短いプロジェクトである場合、優れた単体テストと一緒に開発すると、単体テストなしの開発の1.75-2倍の時間がかかると思います。長いプロジェクトの場合、25〜30%でしょうか。

コードを記述する前に、単体テストを行うことをお勧めします。このように捉えると、単体テストの足場の構築は実際には設計プロセスの一部になるため、単体テストに時間を費やしていることを考慮すべきではなく、単体テストの構築が優れた製品であり、ビルドした後にそのテストが存在することで、それがそのままであることを確認することが容易になります。最初にユニットテストを作成する必要があることは、実際の要件に焦点を当てるのに役立ち、完了したかどうかをテストする明確な方法(ユニットテストに合格)を提供し、「早期にテストして頻繁にテストする」のに役立ちます。

PHPUnitについては...使用して久しぶりですが、印象は強力ですが、実際に磨くにはさらに作業が必要なのかもしれません。

ただし、ここで伝えたいことが1つある場合は、プロジェクトの最後にユニットテストを単なる形式的なものとして表示しないでください。それがすべてだとしたら、私の意見では、それは価値がありません。


3

これまでの回答は非常に詳細なので、カバーされていない点を1つだけ追加します。PHPUnitを使用することによる余分な時間は、

  1. あなたがそれを学んでいるので、最初は高く、そして
  2. 非テスト開発時間を短縮して、自信をつけてください。

プレゼンテーションを扱わないモデルクラスのユニットテストは、非常に簡単です。クラスごとにテストを記述します。これらのテストケースでは、特定のメソッド/機能をテストするためにオブジェクトを直接インスタンス化して構成できます。PHPUnitをセットアップして実行すると、これらのテストをすばやく実行できるようになります。

Webページの単体テストはよりトリッキーになる可能性があります。Zend Framework、Symfony、Smarty、またはその他のMVCエンジンを使用している場合、PHPUnitを適切に動作させるにはさらに時間がかかる可能性があります。私たちはZend Frameworkを使用しており、コントローラーをテストしてスクリプトを分離して表示するための基本クラスの構築にかなりの時間を費やしました。このプロジェクトの規模を考えれば、おそらくから始めるほうがよいでしょうControllerTestCase

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.