2

私が開発しているPHPアプリケーションの場合、現在のgitリビジョンSHAを読み取る必要があります。もちろん、shell_execまたはbackticksを使用してgitコマンドラインクライアントを実行することで簡単に取得できます。

私は明らかにこの呼び出しを独自のメソッドに入れているので、残りの単体テストでこれを簡単に分離してモックすることができます。したがって、私のクラスは次のようになります。

class Task_Bundle
{

    public function execute()
    {
        // Do things
        $revision = $this->git_sha();
        // Do more things
    }

    protected function git_sha()
    {
        return `git rev-parse --short HEAD`;
    }
}

もちろん、git_shaをモックすることでクラスのほとんどをテストできますが、既知の状態を作成する方法がわからないため、実際のgit_sha()メソッドをテストする方法を見つけるのに苦労しています。git rev-parse結果を比較することも要求する単体テストには、実際の価値はないと思いますか?少なくともコマンドが実行されたことを主張することについて疑問に思っていましたが、PHPによって実行されたシェルコマンドの履歴を取得する方法がわかりません-PHPがSHではなくBASHを使用するように指定した場合でも、履歴リストが表示されます空です。個別のバックティックの実行は個別のターミナルセッションであるため、私は推測します。

これをテストする方法についての提案を聞きたいのですが、そのメソッドをテストせずにそのままにして、将来アプリを保守するときに注意してください。

4

3 に答える 3

6

回答を受け入れましたが、投稿されたソリューションが機能し、実際に優れている場合でも、いくつかのバックドローがあるため、ユニットテストがどのように機能するかについて投稿させてください。

まず、外部ソフトウェアをテストするため、実際にコマンドを実行する必要はありません。この瞬間から、制御できない外部のものに依存しています(PCでソフトウェアをテストしたい場合はどうなりますか?gitまたはgit-mockをインストールする必要がありますか?)。本当にやりたいことは、コマンドラインコマンドが正しく実行されているかどうかを確認することです。

以前これに苦労したので、これが私がしたことです:shell_execを実行するクラスを作成しました。シェルを操作したいところはどこでも、クラスを注入して使用します。したがって、テストのために、クラスをモックして、正しいメソッドが実行されているかどうか、および正しいパラメーターが設定されているかどうかを確認できます。

これには多くの利点があります。

  • シェルと対話するポイントが1つあります。将来何かが変更された場合、またはコマンドを実行する前に何かをする必要がある場合は、動作をクラスに追加できます。PHP関数はうまくカプセル化されています。
  • shell_execコマンドが何らかの理由で機能しない場合でも、すべてのPCで機能します。テストは、外部の依存関係を気にすることなく、すべてのPC(開発マシン、テストサーバー、統合サーバー)で実行されます。

もちろん、ソフトウェアが全体として機能することを検証するには、何も模倣しない統合テストを実行する必要があります。しかし、これはまったく別の状況です。ユニットテストでは、クラス(またはメソッド)が必要なことを実行することを確認する必要があります。実際のクラスをどこかで使用することを決定する可能性があるため、これは明確ではない場合があります。これは、それをモックすると多くのオーバーヘッドが発生するためです。しかし、私に関する限り、インストールされていないか、何らかの理由で機能しない可能性のある外部ライブラリ/ソフトウェアに依存している場合、それは決して単体テストではありません。

于 2012-04-15T19:50:25.020 に答える
1

少なくとも、返される文字列が/ ^ [abcdef0-9] {7}$/と一致するかどうかを確認するようなことはできます。

于 2012-04-14T23:29:11.583 に答える
0

本当に必要な場合は、ダミーgitを作成して、その場所を環境のに追加することができると思いますPATH。必要な検証を実行してから、実際の処理と一致する出力を生成します。必要に応じて、実際に転送することもgitできますが、結果を保証することはできません。

ただし、注意が必要です。クラスがだまされて本物だと思われるようにするために十分なことをしたいのですがgit、本物のように振る舞わせると、書くことになります。あなた自身のGitの半ばバージョン。

于 2012-04-14T23:24:59.043 に答える