6

まず、単体テストと呼ばれるかどうかはわかりません。名前が違う場合は、お気軽に修正してください。

私は現在、このようなWebアプリケーションを開発しています。

値をデータベースに保存するフォームを開発しているとしましょう。私は HTML と PHP を開発しています。私はときどきブラウザで F5 キーを押して、HTML/jQuery にバグがなく、PHP でセミコロンの欠落などのエラーが発生しないかどうかを確認します。

完成し、すべてをテストする準備ができたら、コードの小さな部分のテストを開始します。お気に入り;

  1. - $_POST 配列は、フォーム ファイルから値を正しく取得しますか? (print_rでテストしています)
  2. -「$email」変数は、有効な電子メールになるように正しくサニタイズされていますか? (たとえば、aaa@bbb、aa@bb.com、a@@b.net など、さまざまな可能性でテストします。)
  3. -送信されたフォームはすべてのコントロールを通過し、データベースに正常に挿入されていますか? (MySQL テーブルを確認します。)
  4. - フォームにエラー/成功メッセージが正しく表示されていますか?
  5. -...等。

正しい値で動作し、間違った値で失敗した場合。フォームは意図したとおりに機能しており、バグはないと信じているので、別の作業に進みます。

これを行う代わりに、物事が完全に機能することを確認したいのですが、それ以外の場合は、ブラウザーで F5 をスパムすることなく問題について通知します。

このような;

<?php
/* Unit Testing Start --
-ensure: isset($_POST['submit']) returns TRUE;
-ensure: isset($email) returns TRUE;
-ensure: isValidEmail($email) returns TRUE;
-ensure: connectDatabase() returns TRUE;
-ensure: getMysqlAffectedRows() returns 1;
-ensure: hasErrors() returns false;
*/

?>

私のフォームコードは、上に投稿した関数を使用しています。

実行すると、次のようなメッセージが表示されるはずです: (ログも記録することをお勧めします)

Test complete. Tested (6) possibilities, (4) succeeded, (2) failed. 
Failed 1: isValidEmail() returned FALSE, expected: TRUE. 
Failed 2: getMysqlAffectedRows returned NULL/0, expected INTEGER 1.

このようなことで、多くの時間を節約でき、コードの保守が容易になります。

私はこれをしたくありません:

$email = 'xxx@yyy.com';
echo isValidEmail($email) ? 'true' : 'false';

次に、PHP スクリプトからこれらの行を消去する必要があります。手動で削除しない限り、テストは永遠にそこにとどまる必要があります。それらはコメントのようにする必要があるため、本番 Web サイトでは実行されません。ただし、私の開発用 PC では、インストールする必要があるものはすべてインストールし、それらのコメントを解析/ログに記録する必要があります。

それで、ええ。それで全部です。質問に移りましょう:

  • PHPでできることはありますか?もしそうなら、どうすればこれを行うことができますか?

  • それは何と呼ばれますか、単体テストですか、それとも何ですか?

  • 開発したものをどのようにテストしますか?

  • 皆さんはどうやって巨大な Web アプリケーションを心配せずに開発できるのでしょうか? 「この機能を変更すると、ウェブサイト全体が壊れる可能性があります。」? また、機能を変更しても何も壊れていないことをどのように確信していますか? X ページは正常に動作するかもしれませんが、以前は考えられなかったことが原因で Y ページが壊れている可能性があります。同様に、X ページを 3 で割るとうまくいくかもしれませんが、Y ページを 0 で割ると間違いなくエラーになりますが、X ページだけをチェックしましたか?

私の質問に答えて、私がより良い開発者になるのを手伝ってくれたら、本当にうれしいです。

ありがとう!

4

3 に答える 3

7

そうです、自動化されたテストは堅実なソフトウェア開発の土台です。ブラウザをクリックして手動ですべてをチェックし続けることは不可能だからです。単体テストは通常​​、特定の「単位」(通常は関数またはクラス) が指定された入力に対して期待される戻り値を返すことを確認する「技術的な」テストです。機能テストでは、より大きな単位のコードをテストして正しい動作を確認します。受け入れテスト では、ユーザーの観点から最終的なアプリケーションをテストします。

これらのさまざまなニーズに対応するためのフレームワークとツールが多数あります。

  • PHPUnit - PHP のデファクト ユニット テスト フレームワーク
  • Behat - 「ビジネスで読み取り可能な」テストの提供に重点を置いたテスト フレームワーク
  • Codeception - 読みやすく技術的なフレームワーク

上記のすべてに優れたドキュメントがあり、単体テストの操作を簡単に理解できます。まず、PHPUnit を読み込んでから、Behat または Codeception が提供するものを確認することをお勧めします。


一般的なアドバイス: コードが正しく動作するかどうかをテストします。「何が機能するか」をテストするのではなく、何かを実行したときに期待する結果が得られるかどうかをテストします。たとえば、テストしないでくださいisset($_POST['submit'])。これは詳細すぎるため、アプリケーションのすべての行をテストでカバーしても意味がありません。代わりに、より大きな単位のコードをテストしてください。既知の特定の値を含むフォームを送信すると、コードが次のページに正しくリダイレ​​クトされることをテストします。または、認証システムが特権のないユーザーへのアクセスを正しく拒否することをテストします。テストを次のように読みたい:

Scenario: Login
  Given I am on the login page
  When I log in as user "Jon" with the password "foo"
  Then I should be logged in

または:

Scenario: Deny unprivileged user
  Given I am logged in as the user "Jon" with access level 1
  When I try to access the action "restricted"
  Then I should be denied access

いいえ:

Scenario: Login
  Given I submit a form with the values "Jon" as username and "foo" as password
  When I check the $_POST array I should see "Jon" in the key "name" and ...
  ...

ちなみに、上記は文字通りBehatのテストです。


作成したこれらのテストが実際に価値があることを確認するには、定期的に実行する必要があります。バージョン管理システムでトリガーを作成して、コードがチェックインされたときにテスト スイートを自動的に実行し、テストに失敗したチェックインを拒否する場合があります。ただし、継続的インテグレーションサーバーがある場合に最適です。リポジトリから定期的に最新のコードを取得してテストを実行するように設定します。これを適切に設定すると、通常の開発中に見過ごされがちなあらゆる種類のエッジの問題について自動的に通知されます。たとえば、CI サーバーは毎回ゼロからアプリケーションをセットアップして実行しようとする必要があり、依存しているサード パーティから依存関係を取得する際に問題があることや、データベース移行スクリプトに問題があることを警告する場合があります。常に依存関係を取得するとは限らず、移行スクリプトを常に再実行するとは限らないため、他の方法では気付かなかったであろうこと。

最終的には、コードをあらゆる角度から継続的に自動的に「実行」することを目指しています。それが問題を見つける唯一の方法です。

CIソフトは、個人的にはTeamCityがとても好きですが、JenkinsHudsonも人気が高く、他にもCIツールは山ほどあります。

于 2013-02-28T09:55:39.507 に答える
1

ウィキペディアによると:

コンピュータ プログラミングでは、ユニット テストは、ソース コードの個々のユニット、関連付けられた制御データ、使用手順、および操作手順を含む 1 つまたは複数のコンピュータ プログラム モジュールのセットをテストして、それらが使用に適しているかどうかを判断する方法です。

あなたがしていることは、UnitTestingと呼ぶことができると思います。

UnitTest の最善の方法は、よく知られたフレームワークを使用することです。PHP用のものはほとんどありません。最も人気があるのはPHPUnitだと思います。テストとは別に、コード カバレッジ レポートなどの他のクールなことも行います (他のフレームワークも同様に行うと確信しています)。

私はEclipseで作業しており、PHPUnitをIDEに統合しています。開発中、ウィンドウを切り替える必要はありません。テストを実行して、コードが機能するかどうかを確認します。それは多くの時間を節約します。

于 2013-02-28T09:54:53.717 に答える
0

最も単純なものをチェックする必要があるようです。

于 2013-02-28T09:52:52.720 に答える