web-dev-qa-db-ja.com

PHPUnitで仕事を引用するにはどうすればよいですか?

私は15年間ウェブサイトプログラミングを行っており、PHPは過去5年ほどです。私は常に堅実なコードを書いています。しかし、私には80%を主張しているクライアントがいます。単体テスト中のコード。クライアントは常に正しいので、PHP_CodeSnifferを使用してコードが正しく表示されることを確認し、PHPUnitを使用して単体テストを行うことを計画しています。この経験を通じて何かを学びたいと思っています。

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

9
Aaron Jay

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

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

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

ばかげている、または巨大に聞こえるかもしれませんが、そうではないことを保証できます。理由は次のとおりです。

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

PHPUnitは、PHPのユニットテスト用の事実上のツールであり、非常に優れています。私はPHP_CodeSnifferをあまり使用していません。ただ、一人で仕事をしているのなら、おそらく必要ないと思います。チームでは、誰がコーディングしたかに関係なく、コードが同じように見えることを確認する方が便利です。

7
netcoder

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

最初に学ぶべきことは、ユニットテストの必要性はあなたの経験とは何の関係もないということです。最高の開発者は、最高のユニットテスターの1人にもなります。

Bill Venners:あなたはあなたの本の中でリファクタリング: "リファクタリングしたいのなら、本質的な前提条件はしっかりしたテストをすることです。 「それは、テストがない場合はリファクタリングすべきではないという意味ですか?

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

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

私はユニットテストなしでPHPを書いていました。その後、Javaでユニットテストを何年も練習した後、ユニットテストなしではPHPの単一ページよりもはるかに複雑なものに取り組むことができないことに気付きました。理由? 生産性。ユニットテストなしでは、自信を持ってリファクタリングすることはできませんでした。つまり、A)のどちらかを、最初からさらに分解してすべてを処理する必要がありました。繰り返しますが、またはB)、私は醜いレガシーコードを処理する必要があります。

あなたが入札をしているとき、あなたはテストする時間を考慮する必要がありますか? はい。それにはもっと時間がかかると直感的に思えますか? はい、もう一度。他のいくつかの回答が大まかに見積もっているように、おそらく、単体テストがない場合よりも50-100%大きく見積もる必要があります。

しかし!...

  • 仕様の穴を早期に見つけて対処します
  • つまり、よりクリーンでより堅実な仕様に開発することになります
  • 仕様の変更に迅速かつ自信を持って対応できるようになります
  • バグが少なくなります
  • あなたのバグはより早くそしてより簡単に修正されるでしょう

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

テストを行わないと、見積もりはおそらくクラップスになります。バグ、変更要求、および再定義はすべて、正確に見積もるにはひどいものです。テストは、3つすべての影響を最小限に抑えるための鍵です。

5
Nicole

どれくらい時間がかかるかについての簡単な答えはありません。

しかし、基本的なルールとして、それが短いプロジェクトである場合:優れた単体テストを伴う開発は、単体テストを使用しない開発の1.75〜2倍の時間がかかると思います。より長いプロジェクトの場合、おそらく25〜30%ですか?

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

PHPUnitについては……使ってから久しぶりですが、パワフルな印象ですが、磨きをかけるにはもう少し作業が必要かもしれません。

ただし、ここで伝えたいことが1つあるとすれば、プロジェクトの最後にユニットテストを単なる形式的なものと見なさないでください。それだけだとしたら、私の意見では、それは無価値です。

3
Mark Nenadov

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

  1. あなたがそれを学んでいるので最初は高く、そして
  2. 自信を持って、テスト以外の開発時間を短縮します。

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

Webページの単体テストはもっと難しい場合があります。 Zend Framework、Symfony、Smarty、またはその他のMVCエンジンを使用している場合、PHPUnitをそれらとうまく連携させるにはさらに時間がかかる可能性があります。 Zend Frameworkを使用しており、コントローラーとビュースクリプトを分離してテストするための基本クラスの構築にかなりの時間を費やしました。このプロジェクトのサイズを考えると、おそらくControllerTestCaseから始めたほうがよいでしょう。

3
David Harkness