6

PHP と JS を使用して Web アプリケーションを作成しましたが、これは現在動作しています。コードをクリーンアップしながら、単体テストについて学び、今すぐ実装する必要があると判断しました。

何を単体テストすべきか混乱しています。私が見たすべての PHPUnit チュートリアルでは、getter、setter、配列内のアイテムのカウントをテストしています。私が取り組んでいるサイトには、写真を表示するページがあります。ユーザーは写真を気に入ったり、お気に入りに追加したりできます。PHP は主に、backbone.js を実行するクライアント側への API レイヤーとしてサイトで使用されます。

これらの関数の単体テストはどのように作成すればよいですか? 関数 (以下に示す) は、AJAX 経由で送信された $_GET データを取得し、いくつかの行をデータベースに挿入します。セッター、ゲッター、またはカウントを含まず、クラスではありません。単体テストも必要ですか?

これらの関数のために私が書くことができる単体テストの例は、本当に素晴らしいものになるでしょう! :)

/**
 * Create new Set and add item to it
 *  @return  void
 */ 
public function action_create_set() {
    // Get data from user
    $user_id = Input::get('user_id');
    $post_id = Input::get('post_id');
    $set_name = Input::get('set_name');

    // Create new set
    $data = array(
        'user_id' => $user_id,
        'name' => $set_name
    );
    $set_id = DB::table('sets')->insert_get_id($data);

    // Add item to newly created set
    DB::query("INSERT IGNORE INTO posts_sets (post_id, set_id, user_id)
        VALUES ($post_id, $set_id, $user_id)");

    // Change `created_at` & `updated_at` col of 'sets'
    $data = array(
        'created_at' => DB::raw('NOW()'),
        'updated_at' => DB::raw('NOW()')
        );
    DB::table('sets')
        ->where('id', '=', $set_id)
        ->update($data);
}

この最初の関数について、これら 3 つの変数$user_id, $post_id, $set_nameにデータが含まれている必要があることを確認するテストを作成できるというのが私の印象です。2 つのクエリが機能することを確認するテストが必要だinsertと思いますが、行を挿入する関数は PHP フレームワークによって提供され、すでに十分にテストされているため、それ以上の単体テストは必要ないと思います。

別の推測では、テストは関数に 3 つの変数を提供し、新しい行が 2 つのテーブルに挿入されているかどうかを確認する必要がありますが、これは統合テストと見なされませんか?


これは、AJAX を介してユーザーから入力を取得し、結果を JSON 形式で返す関数です。PHPUnit はこの種の API 関数を処理する必要がありますか? または、単体テストをクライアント側で行う必要がありますか?

/**
 * Get items Liked by user
 * @return array
 */
public function action_likes() {

    $user_id = Input::get('user_id');

    $likes = DB::table('likes')
                ->join('posts', 'posts.id', '=', 'likes.post_id')
                ->where('likes.user_id', '=', $user_id)
                ->get();

    return json_encode($likes);

}
4

2 に答える 2

4

最初に、テストする「ユニット」を作成する必要があります。

現在の実装では、すべてが関数に組み込まれています。このようなコードはテストが困難です。

最初は3つに分けることをお勧めします。

最初の部分$_GETは、内部式を処理して構成します。次に、2 番目の部分でそれをデータベースに保存します。最後に、3 番目の部分がデータベース内のオブジェクトを受け取り、応答をレンダリングします。

分割すると、2 番目と 3 番目の関数がテスト可能になります。

これは単純すぎますが、最初のステップとして価値があるかもしれません。興味のある方はMVCで検索してみてください。

于 2012-08-10T01:34:12.493 に答える
1

別の推測では、テストは関数に 3 つの変数を提供し、新しい行が 2 つのテーブルに挿入されているかどうかを確認する必要がありますが、これは統合テストと見なされませんか?

一般的な注意: 単体テストとテストの自動化について一般的に学び始めると、「単体テスト」や「統合テスト」などの用語が実際にはかなり相対的であり、コンテキストに大きく依存していることにすぐに気付くでしょう。

action_create_set 関数の説明から、Web API レイヤーの一部のように扱うことができるようです。このレイヤーのテストを作成する場合は、はい。この関数が実際にデータベースを正しい方法で変換するかどうかをテストすることをお勧めします。

単体テストですか?この関数は「多すぎる」こと (HTTP リクエストからデータを変換し、データベース呼び出しを行い、偽の http リクエストを作成してテストする場合、これには通常、http 処理スタック全体が関与する) を行うため、答えはノーであると主張することができます。

一方、アプリケーションのビジネス ロジックに関して明確に定義された 1 つの責任を持つ Web API の 1 つの機能をテストしています。それは肯定的な答えの議論になります。

個人的には後者の方が好きですが、結局のところ、それほど重要ではありません。

これは、AJAX を介してユーザーから入力を取得し、結果を JSON 形式で返す関数です。PHPUnit はこの種の API 関数を処理する必要がありますか? または、単体テストをクライアント側で行う必要がありますか?

状況によります。テスト自動化の純粋主義者の観点からすると、完全な解決策は両側でテストすることです。

サーバー側のテストでは、action_likes 関数がさまざまな状況でどのように動作するかを説明し、テストする必要があります。

  • 利用可能なデータがない場合、空のセットを返しますか?
  • user_id が存在しないか、形式が正しくない場合はどうなりますか?
  • 典型的なシナリオでは何が返されますか?

この各テストは、データベース内の事前設定されたデータから開始し、返された JSON の内容を確認する必要があります。そうすれば、サーバー API レイヤーをテストできます。

ただし、クライアント側のコードをテストすることも理にかなっています。ほとんどの場合、ajax 呼び出しからデータを正常に受信できないことには、何らかの副作用があると考えられています。

たとえば、受信したデータを処理する必要がある適切なコールバックが実際に呼び出されるか、それに応じて一部のデータ構造が反応するかをテストできます。

この種のテストでは、実際のサーバーと対話するのではなく、この目的のために設計された js ライブラリを使用して AJAX 要求と応答をモックしています。それらの多くがあります。私の現在の好みには、継続的インテグレーション環境での使用にも非常に適していると思われるbuster.jsが含まれています。

于 2012-08-11T11:42:06.187 に答える