ホームページ >バックエンド開発 >PHPチュートリアル >PHPテストフレームワークPHPUnitの基本的な使い方

PHPテストフレームワークPHPUnitの基本的な使い方

Guanhui
Guanhui転載
2020-05-07 09:49:473842ブラウズ

1. はじめに

この記事では、composer の依存関係パッケージ管理ツールを使用して phpunit パッケージのインストールと管理を行います。Composer の正式なアドレスは https:/// getcomposer.org/ にアクセスし、プロンプトに従ってグローバルにインストールしてください。さらに、非常に使いやすい Monolog ロギング コンポーネントを使用して、便宜上ログを記録します。

ルート ディレクトリに coomposer.json の設定ファイルを作成し、次の内容を入力します。

{
    "autoload": {
        "classmap": [
            "./"
        ]
    }
}

上記は、ルート ディレクトリにあるすべてのクラス ファイルをロードし、コマンドで実行することを意味します行 Composer のインストール後、ルート ディレクトリにベンダー フォルダが生成され、今後 Composer を通じてインストールするサードパーティ コードはすべてここに生成されます。

2. なぜ単体テストを行うのか?

print ステートメントまたはデバッグ式に何かを入力しようと考えたときは、それをテストに置き換えてください。 --Martin Fowler

PHPUnit は、PHP プログラミング言語で開発されたオープン ソース ソフトウェアであり、単体テスト フレームワークです。 PHPUnit は Sebastian Bergmann によって作成され、Kent Beck の SUnit から派生したもので、xUnit ファミリのフレームワークの 1 つです。

単体テストは、関数、クラス、メソッドのテストなど、個々のコード オブジェクトをテストするプロセスです。単体テストでは、作成された任意のテスト コードを使用することも、JUnit、PHPUnit、Cantata などの既存のテスト フレームワークを使用することもできます。単体テスト フレームワークは、自動検出ユニットの作成に役立つ一連の一般的で便利な関数を提供します。 . 、実際の値が期待値と一致するかどうかをチェックするアサーションなど。単体テスト フレームワークには多くの場合、各テストのレポートが含まれており、カバーしたコード カバレッジが示されます。

つまり、自動テストに phpunit を使用すると、コードがより堅牢になり、後のメンテナンスのコストが削減されます。これは比較的標準的な仕様でもあります。今日の人気のある PHP フレームワークにはすべて単体テストが付属しています。Laraval などです。 、Symfony、Yii2など、単体テストは標準となっています。

さらに、単体テスト ケースでは、ブラウザーを介して URL にアクセスするのではなく、コマンドを使用してテスト スクリプトを制御します。

3. PHPUnit のインストール

composer メソッドを使用して PHPUnit をインストールします。他のインストール方法については、こちらを参照してください。

composer require --dev phpunit/phpunit ^6.2

phpunit のテストとログ記録に使用される Monolog ログ パッケージをインストールします。

composer require monolog/monolog

インストール後、composer.json ファイルには既に次の 2 つの拡張パッケージが含まれていることがわかります:

"require": {  
     "monolog/monolog": "^1.23",
    },
"require-dev": {
        "phpunit/phpunit": "^6.2"
    },

4. PHPUnit の簡単な使用法

1. 単一ファイルのテスト

ディレクトリ testing を作成し、新しいファイル StackTest.php を作成し、次のように編集します:

<?php
/**
 * 1、composer 安装Monolog日志扩展,安装phpunit单元测试扩展包
 * 2、引入autoload.php文件
 * 3、测试案例
 *
 *
 */
namespace App\tests;
require_once __DIR__ . &#39;/../vendor/autoload.php&#39;;
define("ROOT_PATH", dirname(__DIR__) . "/");
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
{
    public function testPushAndPop()
    {
        $stack = [];
        $this->assertEquals(0, count($stack));
        array_push($stack, &#39;foo&#39;);
        // 添加日志文件,如果没有安装monolog,则有关monolog的代码都可以注释掉
        $this->Log()->error(&#39;hello&#39;, $stack);
        $this->assertEquals(&#39;foo&#39;, $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));
        $this->assertEquals(&#39;foo&#39;, array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
    public function Log()
    {
        // create a log channel
        $log = new Logger(&#39;Tester&#39;);
        $log->pushHandler(new StreamHandler(ROOT_PATH . &#39;storage/logs/app.log&#39;, Logger::WARNING));
        $log->error("Error");
        return $log;
    }
}

コード説明:

StackTest はテスト クラスです

StackTest は PHPUnit\Framework\TestCase

テスト メソッド testPushAndPop() から継承します。テスト メソッドにはパブリック アクセス許可が必要です。通常は、または、「@test で注釈を付ける」を選択して

テスト メソッド内で、assertEquals() に似たアサーション メソッドを使用して、実際の値が期待値と一致することをアサートします。

コマンド ラインの実行:

phpunit コマンド テスト ファイルの名前付け

➜  framework#  ./vendor/bin/phpunit tests/StackTest.php
// 或者可以省略文件后缀名
//  ./vendor/bin/phpunit tests/StackTest

実行結果:

➜  framework# ./vendor/bin/phpunit tests/StackTest.php
PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
.                                                                   1 / 1 (100%)
Time: 56 ms, Memory: 4.00MB
OK (1 test, 5 assertions)

出力された内容は app.log ファイルに表示されます。ログ情報。

2. クラス ファイルの紹介

Calculator.php

<?php  
class Calculator  
{  
    public function sum($a, $b)  
    {  
        return $a + $b;  
    }  
}  
?>

単体テスト クラス:

CalculatorTest.php

<?php
namespace App\tests;
require_once __DIR__ . &#39;/../vendor/autoload.php&#39;;
require "Calculator.php";
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
    public function testSum()
    {
        $obj = new Calculator;
        $this->assertEquals(0, $obj->sum(0, 0));
    }
}

コマンド実行:

> ./vendor/bin/phpunit tests/CalculatorTest

実行結果:

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
F                                                                   1 / 1 (100%)
Time: 117 ms, Memory: 4.00MB
There was 1 failure:

ここでアサーションを意図的に間違って書いた場合、 $this->assertEquals(1, $obj->sum(0 , 0));

実行結果を見てください:

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
F                                                                   1 / 1 (100%)
Time: 117 ms, Memory: 4.00MB
There was 1 failure:
1) App\tests\CalculatorTest::testSum
Failed asserting that 0 matches expected 1.
/Applications/XAMPP/xamppfiles/htdocs/web/framework/tests/CalculatorTest.php:22
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

はメソッドのエラー メッセージと行番号を直接報告するため、バグを迅速に見つけるのに役立ちます

3. 高度な使用法

各テスト メソッド名の前に「test」を追加することにうんざりしていませんか? 呼び出しのパラメーターだけが異なるため、複数のテスト ケースを作成するのに苦労していませんか?私が今お勧めするお気に入りの高度な機能は、Frame Builder と呼ばれるものです。

Calculator.php

<?php  
class Calculator  
{  
    public function sum($a, $b)  
    {  
        return $a + $b;  
    }  
}  
?>

テスト ケースを開始するコマンド ライン、キーワード --skeleton

> ./vendor/bin/phpunit --skeleton Calculator.php

を使用します実行結果:

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
Wrote test class skeleton for Calculator to CalculatorTest.php.

In't非常に簡単ですか? テスト データがないため、ここにテスト データを追加して、上記のコマンドを再実行します

<?php  
class Calculator  
{  
    /** 
     * @assert (0, 0) == 0 
     * @assert (0, 1) == 1 
     * @assert (1, 0) == 1 
     * @assert (1, 1) == 2 
     */  
    public function sum($a, $b)  
    {  
        return $a + $b;  
    }  
}  
?>

元のクラスのすべてのメソッドが @assert アノテーションについてテストされます。これらは次のようなテスト コードに変換されます。

    /**
     * Generated from @assert (0, 0) == 0.
     */
    public function testSum() {
        $obj = new Calculator;
        $this->assertEquals(0, $obj->sum(0, 0));
    }

実行結果:

推奨チュートリアル: "PHP Tutorial"

以上がPHPテストフレームワークPHPUnitの基本的な使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。