5

PHP 5 を使用して作成した多くの関数をテストする必要があります。これらの関数は、Web アプリケーションで必要なデータベース CRUD タイプのアクション (SELECT、UPDATE、INSERT、DELETE) を実行します。

Simple Test や PHP Unit などの PHP 単体テスト スイートを見てきましたが、これらは必要なものを提供しているように見えますが、同等のパーティショニングと境界分析がそれほど明確ではないため、これをどのように達成するのかわかりません。異なる変数を入力してこれを変更するだけでよいですか? 異なる文字列が必ずしも違いを生むとは限らないため、これはかなり無意味に思えます。

私はこれまでにこれに遭遇したことがないので、これに関するガイダンスは役に立ちます。

4

2 に答える 2

4

PHP コードと MySQL データベース間の相互作用をテストしている場合は、単体テストではなく統合テストを実行しています。

Enhance PHP フレームワークとの統合テストの例を次に示します。これは、Tenant オブジェクトを保存および取得するリポジトリ クラスをテストします。

事前に入力されたデータベースに対して実行する代わりに、完全に空のデータベースで実行し、単純なテーブル ヘルパーを使用してテーブルを作成および破棄します。これにより、テストデータベースで特定のデータが正しい状態にあるという依存関係がなくなります。これは、維持するのが困難です。

<?php
class TenantRepositoryTestFixture extends EnhanceTestFixture {
    private $Target;

    public function SetUp() {
        $tables = new TableHelper();
        $tables->CreateTenantTable();
        $this->Target = Enhance::GetCodeCoverageWrapper('TenantRepository');
    }

    public function TearDown() {
        $tables = new TableHelper();
        $tables->DropTenantTable();
    }

    public function SaveWithNewTenantExpectSavedTest() {
        $tenant = new Tenant();
        $tenant->Name = 'test';

        $saved = $this->Target->Save($tenant);
        $result = $this->Target->GetById($saved->Id);

        Assert::AreNotIdentical(0, $result->Id);
        Assert::AreIdentical($tenant->Name, $result->Name);
    }

    public function SaveWithExistingTenantExpectSavedTest() {
        $tenant = new Tenant();
        $tenant->Name = 'test';
        $saved = $this->Target->Save($tenant);
        $saved->Name = 'changed';
        $saved = $this->Target->Save($saved);

        $result = $this->Target->GetById($saved->Id);

        Assert::AreIdentical($saved->Id, $result->Id);
        Assert::AreIdentical($saved->Name, $result->Name);
    }
}
?>
于 2011-08-29T16:41:41.140 に答える
1

一般に、単体テストの考え方は、変更を加えた場合に単純な一連のテストを実行して、既存の機能が壊れないようにすることです。つまり、予想される典型的なデータだけでなく、引用符付きの文字列 (適切にエスケープされていることを確認するため)、SQL インジェクション攻撃 (同じ) を含む可能性のあるエッジ/境界ケースもカバーする必要があります。 、空の文字列、異なるエンコーディングの文字列、NULL、booleantrueなど。各テストでは、入力したデータが与えられたときに、期待される結果が得られていることを確認する必要があります。 、空の文字列が挿入された、別のエンコーディングが変換またはスローされてから挿入された、NULL 値でスローされたエラー、文字列 'true' が挿入された、など。

ここ数年、どちらのテスト フレームワークも使用していませんが、PHPUnit で良い結果が得られたことを覚えています。

于 2011-04-09T01:37:30.547 に答える