Bản phát hành “Spicy Summer” của Pest
Vào ngày 20 tháng 3 năm 2023, chúng tôi tự hào giới thiệu Pest 2.0, đánh dấu nó là bản phát hành quan trọng nhất cho đến thời điểm hiện tại, với hơn 7 triệu lượt tải xuống tính đến thời điểm viết bài này. Phiên bản này giới thiệu một plugin kiến trúc đáng chú ý, cải tiến tốc độ lên đến 80% trong kiểm thử song song, tùy chọn phân tích hiệu suất và nhiều tính năng khác.
Khi mùa hè đang đến gần, chúng tôi rất phấn khởi để thông báo về bản phát hành sắp tới: bản phát hành “Spicy Summer” được mong đợi từ lâu. Bản phát hành này mang đến một loạt tính năng thú vị, khiến nó trở nên giống như một phiên bản chính mà không phải thật sự là vậy – đó là Pest v2.9.0 – chỉ cách “composer update” một bước. Mà không còn chần chừ, hãy cùng khám phá những gì chúng tôi đã chuẩn bị cho bạn trong mùa hè này:
- Tích hợp Snapshot Testing để kiểm tra đầu ra dài của mã của bạn một cách dễ dàng
- Các khối mô tả, để nhóm các bài kiểm tra và chia sẻ logic thiết lập và dọn dẹp
- Thử nghiệm kiến trúc ++, kiểm tra kiến trúc mạnh mẽ hơn
- Plugin Độ phủ loại, để đo tỷ lệ phần trăm mã được bao phủ bởi các khai báo kiểu
- Plugin Drift, để tự động chuyển đổi các bài kiểm tra PHPUnit của bạn sang Pest
Built-in Snapshot Testing
Kiểm thử snapshot là một kỹ thuật kiểm thử cho phép bạn xác nhận rằng đầu ra của một hàm hoặc phương thức không thay đổi. Đây là một cách tuyệt vời để kiểm thử mã nguồn của bạn và đảm bảo rằng mã của bạn không thay đổi một cách không mong đợi.
Và bây giờ, chúng tôi tự hào thông báo rằng Pest sẽ có tích hợp sẵn kiểm thử snapshot. Ví dụ, giả sử điểm cuối “contacts” của bạn trả về một đoạn mã HTML cụ thể mỗi khi chạy. Bạn có thể viết một kiểm thử như sau:
it('has a contact page', function () {
$response = $this->get('/contact');
expect($response)->toMatchSnapshot();
});
Lần đầu tiên bạn chạy kiểm thử này, nó sẽ tạo một tệp snapshot – nằm tại tests/.pest/snapshots – chứa nội dung của phản hồi. Lần chạy kiểm thử tiếp theo, nó sẽ so sánh phản hồi với tệp snapshot. Nếu phản hồi khác biệt, kiểm thử sẽ thất bại. Nếu phản hồi giống nhau, kiểm thử sẽ thành công.
Ngoài ra, giá trị kỳ vọng không nhất thiết phải là một phản hồi; nó có thể là bất cứ thứ gì. Ví dụ, bạn có thể lưu trữ lại một mảng bằng cách sử dụng snapshot:
$array = /** Fetch array somewhere */;
expect($array)->toMatchSnapshot();
Và tất nhiên, bạn có thể “xây dựng lại” các tệp snapshot bất kỳ lúc nào bằng cách sử dụng tùy chọn –update-snapshots:
./vendor/bin/pest --update-snapshots
Describe Blocks
Kể từ khi chúng tôi phát hành Pest, các khối “describe” đã là một trong những tính năng được yêu cầu nhiều nhất. Chúng là cơ bản đối với bất kỳ framework kiểm thử “hàm” nào, vì chúng cho phép bạn nhóm các kiểm thử và chia sẻ logic thiết lập và hủy bỏ thiết lập.
beforeEach(fn () => $this->user = User::factory()->create());
describe('auth', function () {
beforeEach(fn () => $this->actingAs($this->user));
test('cannot login when already logged in', function () {
// ...
});
test('can logout', function () {
// ...
});
})->skip(/* Skip the entire describe block */);
describe('guest', function () {
test('can login', function () {
// ...
});
// ...
});
Architectural Testing++
Pest luôn tập trung vào việc làm cho việc kiểm thử thú vị hơn. Trong bản phát hành trước, chúng tôi giới thiệu các kỳ vọng kiến trúc, cho phép bạn kiểm thử kiến trúc của mã nguồn. Trong bản phát hành này, chúng tôi tự hào thông báo rằng Pest cải tiến kỳ vọng kiến trúc bằng cách thêm những kỳ vọng mới.
test('controllers')
->expect('App\Http\Controllers')
->toUseStrictTypes()
->toHaveSuffix('Controller') // or toHavePreffix, ...
->toBeReadonly()
->toBeClasses() // or toBeInterfaces, toBeTraits, ...
->classes->not->toBeFinal() // 🌶
->classes->toExtendNothing() // or toExtend(Controller::class),
->classes->toImplementNothing() // or toImplement(ShouldQueue::class),
Type Coverage Plugin
Như bạn có thể biết, Pest cung cấp tùy chọn –coverage cho phép bạn tạo một báo cáo phủ sóng tuyệt đẹp trên cửa sổ dòng lệnh. Báo cáo này sẽ hiển thị các dòng mã code được kiểm thử phủ sóng. Điều này là một cách tuyệt vời để đảm bảo rằng các kiểm thử của bạn bao trùm toàn bộ mã code.
Ngoài ra, chúng tôi tự hào thông báo rằng Pest hiện sẽ tích hợp sẵn hỗ trợ kiểm thử phủ sóng loại hình. Điều này có nghĩa là bạn có thể xem liệu mã nguồn của bạn có sử dụng “kiểu” ở mọi vị trí có thể. Ví dụ, giả sử bạn có một kho lưu trữ có phương thức sau:
public function find($id)
{
return User::find($id);
}
Phương thức này thiếu kiểu tham số và kiểu trả về. Do đó, nếu bạn chạy lệnh pest –type-coverage, bạn sẽ thấy đầu ra như sau và biết rằng bạn cần thêm kiểu cho phương thức này:
...
app/Models\User.php .......................................... 100%
app/Repositories/UserRepository.php .................. pa8, rt8 33%
───────────────────────────────────────────────────────────────────
Total: 91.6 %
In addition, just like regular coverage, you may enforce --min type coverage percentage. For example, if you run --type-coverage --min=100, you will see the following output:
...
app/Models\User.php .......................................................... 100%
app/Repositories/UserRepository.php .................................. pa8, rt8 33%
───────────────────────────────────────────────────────────────────────────────────
Total: 91.6 %
ERROR Type coverage below expected: 91.6%. Minimum: 100.0%
Drift Plugin
Đúng vậy, bạn đã đọc đúng. Chúng tôi tự hào thông báo rằng Pest sẽ có một công cụ giống như Laravel shift, được gọi là Drift. Drift sẽ cho phép bạn nâng cấp các kiểm thử PHPUnit của bạn thành kiểm thử Pest chỉ trong vài giây.
Vì vậy, nếu bạn có một kiểm thử như sau:
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
public function test_that_true_is_true(): void
{
$this->assertTrue(true);
}
}
Bạn có thể chạy lệnh ./vendor/bin/pest –drift và Pest sẽ tự động chuyển đổi kiểm thử PHPUnit của bạn thành kiểm thử Pest:
test('true is true', function () {
expect(true)->toBeTrue();
});
Cảm ơn bạn đã đọc về những tính năng mới của Pest 2.9!