我在2015年中開始學習純PHP。然後,我熟悉了CodeIgniter 3和Laravel 5.1。多年來,Laravel 是我選擇的框架,而且我仍然堅持使用它。與其他流行的 PHP 專案一樣,我認為 PHPUnit 是單元測試的唯一選擇。但2021年佩斯來了,情況發生了一些變化。它是由 Laravel 工程師 Nuno Maduro 創建的,他還製作了許多在 PHP 和 Laravel 社區中廣泛使用的優秀專案/套件。
從 Pest 的第一天起,我就不再關心它了,因為 PHPUnit 對我來說已經足夠了,我懶得學習這個新的測試工具。但 Laravel 社群發展越多,推薦的 Pest 就越多。 Spatie、Livewire、Filament 等的許多 Laravel 專案/包都使用 Pest。所以問題是當測試與它們相關的東西時,我必須移植到 PHPUnit。我似乎別無選擇。是時候去看看佩斯了。
在安裝部分之後,我使用 Pest 建立我的第一個 PHP 專案。
mkdir ~/Herd/lerning-pest cd ~/Herd/learning-pest composer require pestphp/pest --dev --with-all-dependencies ./vendor/bin/pest --init
目錄結構與PHPUnit幾乎相同。不同之處在於測試的外觀。它是基於閉包而不是基於類別的。
<?php // tests/Unit/ExampleTest.php test('example', function () { expect(true)->toBeTrue(); });
我知道使用 Closure 可以在運行時將方法延遲附加到物件。所以這可以像這樣在 PHPUnit 中重寫。
<?php // tests/Unit/ExampleTest.php class ExampleTest extends \PHPUnit\Framework\TestCase { public function test_example() { $this->assertTrue(true); } }
它說 Pest 斷言語法受到 Ruby 的 Rspec 和 Jest 的啟發,我不知道。所以,我對他們也沒有太大興趣。對我來說,斷言文法如何並不重要。
我只是喜歡執行測試時顯示的結果。我認為它比 PHPUnit 更漂亮、更乾淨。
這些是我在 PHPUnit 中使用最多的斷言。
$this->assertSame($expected, $actual); $this->assertTrue($condition); $this->assertFalse($condition); $this->assertNull($actual); $this->assertEmpty($array); $this->assertCount($count, $countable); $this->assertInstanceof($type, $instance);
它們可以很容易地用 Pest 重寫。
expect($actual)->toBe($expected); expect($condition)->toBeTrue(); expect($condition)->toBeFalse(); expect($actual)->toBeNull(); expect($actual)->toBeEmpty(); expect($actual)->toBeInstanceOf($type);
正如我之前提到的,Pest 斷言語法很好,但我目前堅持使用 PHPUnit,因為我不需要研究新的 API。不管怎樣,我更喜歡 PHPUnit 斷言,並且只使用 Pest 中獨特的東西。架構測試就是一個例子。我的測試文件如下所示。
<?php test("all PHP files in LearningPest namespace must have strict mode enabled", function () { arch() ->expect('LearningPest') ->toUseStrictTypes(); }); test('all PHPUnit assertions are available for Pest', function () { $instance = new \stdClass(); $getInstance = function () use ($instance) { return $instance; }; $this->assertSame($instance, $getInstance()); $this->assertInstanceOf(stdClass::class, $instance); $this->assertTrue(1 < 2); $this->assertFalse(1 > 2); $value = null; $this->assertNull($value); $this->assertEmpty([]); $array = [1, 2, 3]; $this->assertCount(3, $array); });
有許多強制功能使我能夠像 PHPUnit 一樣在 Pest 中工作。他們在這裡:
Mockery 是一個獨立的函式庫,所以我不在這裡列出它。
另一方面,Pest 有很多東西可能會派上用場,例如架構、快照或壓力測試和插件。我會在編寫測試時發現它們。
如果你是個沒有使用過 Pest 的 PHP 開發者,不妨試試看。
以上是我最終嘗試了 Pest for PHP & Laravel,然後進行了切換的詳細內容。更多資訊請關注PHP中文網其他相關文章!