10 thủ thuật tối ưu quá trình Testing trong Laravel
Trong quá trình phát triển ứng dụng Laravel, testing đóng một vai trò quan trọng để đảm bảo tính ổn định và chất lượng của sản phẩm. Tuy nhiên, việc thực hiện testing một cách hiệu quả và nhanh chóng không phải là điều dễ dàng. Vì vậy, trong bài viết này, chúng ta sẽ tìm hiểu về 10 thủ thuật để tối ưu hóa quá trình testing trong Laravel, giúp bạn tiết kiệm thời gian và công sức trong quá trình phát triển sản phẩm.
1. Sử dụng Continuous Integration để tự động hóa quá trình testing
Continuous Integration (CI) là một phương pháp phát triển phần mềm, trong đó các thay đổi của mã nguồn được tự động kiểm thử và tích hợp với các phiên bản hiện tại của ứng dụng. Trong Laravel, bạn có thể sử dụng các công cụ CI để tự động kiểm thử ứng dụng của mình và đảm bảo rằng các thay đổi của mã nguồn không gây ra sự cố.
Để sử dụng CI trong Laravel, bạn cần các công cụ như Git và một dịch vụ CI như Travis CI hoặc CircleCI. Sau đây là một số bước cơ bản để tích hợp CI vào Laravel:
Tạo file .travis.yml hoặc .circleci/config.yml trong thư mục gốc của ứng dụng Laravel của bạn để cấu hình dịch vụ CI.
Bài viết này được đăng tại [free tuts .net]
Trong file cấu hình, bạn sẽ cần định nghĩa các bước cần thiết để chạy kiểm thử.
Ví dụ:
language: php php: - 8.0 services: - mysql before_script: - composer install --prefer-source --no-interaction - cp .env.example .env - php artisan key:generate - php artisan migrate --no-interaction -vvv script: - vendor/bin/phpunit
Trong ví dụ trên, chúng ta đang cấu hình Travis CI để sử dụng PHP 8.0 và MySQL. Trước khi chạy kiểm thử, chúng ta cần cài đặt các gói phụ thuộc của Laravel thông qua Composer và tạo file .env. Sau đó, chúng ta chạy các câu lệnh artisan để tạo bảng trong cơ sở dữ liệu và sinh khóa bảo mật. Cuối cùng, chúng ta chạy PHPUnit để chạy các kiểm thử Laravel của chúng ta.
Khi bạn đã cấu hình file cấu hình CI, hãy đăng ký tài khoản với dịch vụ CI của bạn và liên kết kho lưu trữ GitHub hoặc GitLab của bạn với tài khoản CI của bạn. Bằng cách làm như vậy, CI sẽ tự động chạy các kiểm thử của bạn mỗi khi bạn đẩy các thay đổi mới vào kho lưu trữ.
Kiểm tra kết quả CI để đảm bảo rằng các kiểm thử của bạn đã chạy thành công và không có lỗi nào xảy ra. Nếu có lỗi, hãy sửa chúng và đẩy lại mã của bạn để CI chạy lại kiểm thử.
Tích hợp CI vào Laravel giúp bạn tự động hóa quá trình kiểm thử và giảm thiểu sự cố trong quá trình triển khai ứng dụng. Bằng cách tích hợp CI, bạn có thể đảm bảo rằng các thay đổi của mã nguồn không gây ra lỗi và không phá vỡ các tính năng hiện có của ứng dụng. Điều này giúp cho quá trình phát triển phần mềm trở nên nhanh chóng, hiệu quả và đảm bảo chất lượng.
Một số lợi ích của việc sử dụng CI trong Laravel:
-
Tự động kiểm tra mã nguồn: Điều này giúp bạn đảm bảo rằng các thay đổi của mã nguồn không gây ra lỗi và không phá vỡ các tính năng hiện có của ứng dụng.
-
Tiết kiệm thời gian: Với CI, bạn không cần phải chạy kiểm thử một cách thủ công mỗi khi bạn thay đổi mã nguồn. CI tự động kiểm thử ứng dụng của bạn và báo cáo lỗi (nếu có) trong vòng vài phút sau khi bạn đẩy các thay đổi.
-
Giảm thiểu các lỗi liên quan đến triển khai: Sử dụng CI giúp bạn đảm bảo rằng mã nguồn của bạn đã được kiểm tra kỹ trước khi triển khai vào môi trường sản xuất. Điều này giảm thiểu khả năng phát sinh lỗi khi triển khai ứng dụng của bạn.
-
Tăng tính linh hoạt và tiện lợi: Khi bạn sử dụng CI, bạn có thể chạy kiểm thử của mình trên nhiều môi trường khác nhau (ví dụ: trên máy chủ Linux, Windows, Mac OS X) và đảm bảo rằng ứng dụng của bạn hoạt động đúng trên tất cả các môi trường này.
2.Sử dụng Tinker để tạo dữ liệu mẫu
Tinker là một công cụ giúp chúng ta tương tác với ứng dụng Laravel thông qua một giao diện dòng lệnh. Tinker cho phép chúng ta thực thi các lệnh PHP và truy vấn cơ sở dữ liệu trực tiếp trên ứng dụng Laravel, giúp tiết kiệm thời gian khi tạo dữ liệu mẫu cho quá trình testing.
Các bước sử dụng Tinker để tạo dữ liệu mẫu trong Laravel bao gồm:
Khởi động Tinker
Để khởi động Tinker, chúng ta sử dụng lệnh trên terminal.
php artisan tinker
Tạo dữ liệu mẫu
Chúng ta có thể tạo dữ liệu mẫu bằng cách sử dụng các lệnh PHP và truy vấn cơ sở dữ liệu trong Tinker.
Ví dụ:
// Tạo một user mới $user = new App\Models\User; $user->name = 'John Doe'; $user->email = 'johndoe@example.com'; $user->password = bcrypt('password'); $user->save(); // Tạo một bài viết mới của freetuts.net $post = new App\Models\Post; $post->title = 'New Post'; $post->body = 'This is a new post.'; $post->user_id = $user->id; $post->save();
Kiểm tra dữ liệu: Chúng ta có thể kiểm tra dữ liệu bằng cách sử dụng các lệnh PHP và truy vấn cơ sở dữ liệu trong Tinker.
Ví dụ:
// Lấy danh sách user $users = App\Models\User::all(); $users->toArray(); // Lấy danh sách bài viết $posts = App\Models\Post::all(); $posts->toArray();
Tinker giúp chúng ta tạo dữ liệu mẫu nhanh chóng và tiện lợi trong quá trình testing. Ngoài ra, chúng ta cũng có thể sử dụng Tinker để debug và kiểm tra thông tin trong ứng dụng Laravel.
3. Sử dụng Faker để tạo dữ liệu giả
Faker là một thư viện được sử dụng để tạo dữ liệu giả lập (fake data) trong quá trình phát triển và testing ứng dụng. Thư viện này cung cấp các phương thức để tạo dữ liệu như tên, địa chỉ, số điện thoại, email, ngày tháng, số tiền, etc.
Để sử dụng Faker trong Laravel, trước tiên bạn cần cài đặt nó bằng Composer:
composer require fakerphp/faker
Sau khi cài đặt xong, bạn có thể sử dụng Faker bằng cách tạo một đối tượng mới của lớp Faker trong các test case của bạn
use Faker\Factory as Faker; class ExampleTest extends TestCase { public function testExample() { $faker = Faker::create(); $name = $faker->name; $email = $faker->email; $phoneNumber = $faker->phoneNumber; // ... } }
Ở đây, chúng ta đã tạo một đối tượng Faker và sử dụng nó để tạo ra các dữ liệu giả lập như tên, email và số điện thoại. Ngoài ra, Faker còn cung cấp nhiều phương thức khác để tạo ra các loại dữ liệu khác như địa chỉ, số tiền, ngày tháng, etc.
Sử dụng Faker để tạo dữ liệu giả lập là một cách hiệu quả để giảm thiểu thời gian và công sức cần thiết trong quá trình testing ứng dụng của bạn. Nó cũng giúp đảm bảo tính đáp ứng của ứng dụng trong nhiều trường hợp khác nhau.
4. Sử dụng PHPUnit để viết các test case
PHPUnit là một framework testing cho PHP, nó được sử dụng rộng rãi trong Laravel để viết các test case. PHPUnit cung cấp cho chúng ta một cách đơn giản để viết các test case và kiểm tra các kết quả của chúng. Để sử dụng PHPUnit trong Laravel, chúng ta có thể thực hiện các bước sau:
Cài đặt PHPUnit
PHPUnit là một dependency của Laravel, vì vậy chúng ta không cần phải cài đặt thêm. Tuy nhiên, để sử dụng phiên bản mới nhất của PHPUnit, chúng ta có thể cài đặt nó bằng Composer:
composer require --dev phpunit/phpunit
Viết các test case
Chúng ta có thể viết các test case bằng cách tạo các file test trong thư mục tests của Laravel.
Ví dụ:
<?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; class ExampleTest extends TestCase { /** * A basic test example. * * @return void */ public function testBasicTest() { $response = $this->get('/'); $response->assertStatus(200); } }
Trong đó, chúng ta sử dụng phương thức get để gửi một HTTP request đến đường dẫn /, và phương thức assertStatus để kiểm tra rằng response trả về có status code là 200.
Chạy các test case
Để chạy các test case, chúng ta có thể sử dụng Artisan command test:
php artisan test
Hoặc chúng ta có thể chỉ định các file test cụ thể để chạy:
php artisan test tests/Unit/ExampleTest.php
5. Sử dụng Model Factories để tạo dữ liệu mẫu
Model Factories là một trong những công cụ hữu ích trong Laravel để tạo dữ liệu mẫu cho quá trình testing. Với Model Factories, chúng ta có thể định nghĩa các bản ghi mẫu cho các model trong ứng dụng và sử dụng chúng để tạo dữ liệu mẫu trong quá trình testing.
Các bước sử dụng Model Factories để tạo dữ liệu mẫu trong Laravel bao gồm:
Tạo Model Factory
Để tạo Model Factory cho một model trong ứng dụng Laravel, chúng ta sử dụng artisan command make:factory.
Ví dụ:
php artisan make:factory UserFactory --model=User
Command này sẽ tạo ra một file UserFactory.php trong thư mục database/factories của ứng dụng.
Định nghĩa các bản ghi mẫu
Trong file Model Factory, chúng ta định nghĩa các bản ghi mẫu cho model tương ứng bằng cách sử dụng hàm define.
Ví dụ:
use Illuminate\Support\Str; use Faker\Generator as Faker; $factory->define(App\Models\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => bcrypt('password'), // password 'remember_token' => Str::random(10), ]; });
Trong ví dụ trên, chúng ta định nghĩa một bản ghi mẫu cho model User với các thuộc tính name, email, password và remember_token được tạo ngẫu nhiên bởi Faker.
Sử dụng Model Factory trong quá trình testing: Để sử dụng Model Factory để tạo dữ liệu mẫu trong quá trình testing, chúng ta sử dụng hàm factory trong các unit test của ứng dụng.
Ví dụ:
use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\DatabaseTransactions; class UserTest extends TestCase { use DatabaseTransactions, WithFaker; public function test_create_user() { $user = factory(App\Models\User::class)->create(); $this->assertDatabaseHas('users', [ 'email' => $user->email, ]); } }
Trong ví dụ trên, chúng ta sử dụng Model Factory để tạo một user mới và kiểm tra xem user này đã được lưu vào cơ sở dữ liệu hay chưa.
6. Sử dụng Selenium để thực hiện testing trên trình duyệt
Selenium là một công cụ tự động hóa testing trên trình duyệt web. Nó cho phép chúng ta viết các kịch bản tự động để kiểm tra các chức năng của ứng dụng web trên các trình duyệt khác nhau. Trong Laravel, chúng ta có thể sử dụng Selenium để thực hiện testing trên trình duyệt như sau:
Cài đặt Selenium
Chúng ta cần cài đặt Selenium Server và WebDriver để Selenium có thể tương tác với các trình duyệt. Để cài đặt Selenium Server, chúng ta có thể tải xuống từ trang chủ của Selenium. Để cài đặt WebDriver, chúng ta có thể sử dụng Composer:
composer require --dev facebook/webdriver
Viết các kịch bản test
Chúng ta có thể viết các kịch bản test bằng cách sử dụng WebDriver để tương tác với các trang web.
Ví dụ:
<?php use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\WebDriverBy; class ExampleTest extends PHPUnit_Framework_TestCase { protected $driver; public function setUp() { $capabilities = DesiredCapabilities::chrome(); $this->driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities); } public function tearDown() { $this->driver->quit(); } public function testTitle() { $this->driver->get('https://example.com'); $this->assertEquals('Example Domain', $this->driver->getTitle()); } public function testForm() { $this->driver->get('https://example.com'); $this->driver->findElement(WebDriverBy::name('q'))->sendKeys('Selenium'); $this->driver->findElement(WebDriverBy::name('btnK'))->click(); $this->assertEquals('Selenium - Google Search', $this->driver->getTitle()); } }
Trong đó, chúng ta sử dụng WebDriver để khởi tạo trình duyệt và tương tác với các trang web. Các phương thức như get, findElement và click được sử dụng để tìm kiếm các phần tử trên trang và tương tác với chúng.
Chạy các kịch bản test
Để chạy các kịch bản test, chúng ta có thể sử dụng PHPUnit bằng cách chạy lệnh:
./vendor/bin/phpunit
7.Sử dụng Laravel Dusk để thực hiện testing trên ứng dụng web
Laravel Dusk là một công cụ testing tự động được tích hợp sẵn trong Laravel, cho phép chúng ta thực hiện testing trên ứng dụng web với các trình duyệt như Chrome và Firefox. Để sử dụng Laravel Dusk, chúng ta có thể thực hiện các bước sau:
Cài đặt Laravel Dusk
Laravel Dusk được cài đặt sẵn trong Laravel, vì vậy chúng ta không cần phải cài đặt thêm. Tuy nhiên, để sử dụng được Laravel Dusk, chúng ta cần cài đặt một số phụ thuộc bổ sung bằng Composer:
composer require --dev laravel/dusk php artisan dusk:install
Viết các test case
Chúng ta có thể viết các test case bằng cách tạo các file test trong thư mục tests/Browser của Laravel.
Ví dụ:
<?php namespace Tests\Browser; use Tests\DuskTestCase; use Laravel\Dusk\Browser; use Illuminate\Foundation\Testing\DatabaseMigrations; class ExampleTest extends DuskTestCase { /** * A basic browser test example. * * @return void */ public function testBasicExample() { $this->browse(function (Browser $browser) { $browser->visit('/') ->assertSee('freetuts.net'); }); } }
Trong đó, chúng ta sử dụng phương thức visit để truy cập đến trang chủ của ứng dụng, và phương thức assertSee để kiểm tra rằng trang đó có chứa chuỗi "freetuts.net".
Chạy các test case
Để chạy các test case, chúng ta có thể sử dụng Artisan command dusk:
php artisan dusk
Laravel Dusk sẽ mở một trình duyệt và thực hiện các hành động và kiểm tra được định nghĩa trong các test case. Sau khi kết thúc, Laravel Dusk sẽ cung cấp cho chúng ta kết quả của các test case, cùng với các thông tin chi tiết về các hành động được thực hiện trong quá trình testing.
8. Sử dụng Mock Objects để thay thế các phụ thuộc
Trong Laravel, bạn có thể sử dụng Mockery, một thư viện Mocking nổi tiếng trong PHP, để tạo ra các đối tượng giả lập. Để sử dụng Mockery, bạn cần cài đặt nó thông qua Composer:
composer require --dev mockery/mockery
Sau đó, bạn có thể sử dụng Mockery để tạo ra các đối tượng giả lập trong kiểm thử Laravel của mình. Ví dụ, nếu bạn muốn tạo ra một đối tượng giả lập cho một lớp Eloquent model trong Laravel, bạn có thể sử dụng đoạn mã sau:
use App\Models\User; use Mockery; // Create a mock instance of the User model $userMock = Mockery::mock(User::class);
Sau đó, bạn có thể định nghĩa các phương thức giả lập cho đối tượng này, ví dụ:
// Define the behavior of the mock object $userMock->shouldReceive('find') ->once() ->with(1) ->andReturn(new User(['id' => 1, 'name' => 'freetuts.net']));
Trong ví dụ trên, chúng ta đang giả lập phương thức find() của lớp User model. Phương thức này sẽ được gọi một lần với tham số là 1, và sẽ trả về một đối tượng User với id là 1 và tên là "freetuts.net".
Khi bạn muốn sử dụng đối tượng giả lập này trong kiểm thử của mình, bạn có thể truyền nó vào các phương thức hoặc constructor của lớp cần kiểm thử:
use App\Services\UserService; class UserServiceTest extends TestCase { public function testGetUserById() { // Create a mock instance of the User model $userMock = Mockery::mock(User::class); $userMock->shouldReceive('find') ->once() ->with(1) ->andReturn(new User(['id' => 1, 'name' => 'John Doe'])); // Create an instance of the UserService class with the mock object $userService = new UserService($userMock); // Call the method being tested $result = $userService->getUserById(1); // Assert that the method returns the expected result $this->assertEquals('John Doe', $result->name); } }
Trong ví dụ trên, chúng ta đang kiểm thử phương thức getUserById() của lớp UserService.
Chúng ta đã tạo ra một đối tượng giả lập cho lớp User model, và truyền nó vào constructor của lớp UserService để sử dụng trong phương thức kiểm thử. Sau đó, chúng ta gọi phương thức getUserById() và kiểm tra kết quả trả về.
9. Sử dụng Code Coverage để đo đạc độ bao phủ của test case
Code Coverage là một công cụ quan trọng để đo đạc độ bao phủ của test case trong Laravel. Độ bao phủ là tỷ lệ giữa số lượng code được thực thi trong quá trình testing và tổng số lượng code của ứng dụng. Độ bao phủ càng cao thì độ tin cậy của test case càng cao.
Để sử dụng Code Coverage trong Laravel, chúng ta có thể sử dụng PHPUnit và Xdebug. Các bước sử dụng Code Coverage trong Laravel như sau:
Cài đặt Xdebug-
Để sử dụng Code Coverage, chúng ta cần cài đặt Xdebug trên máy tính. Xdebug là một extension của PHP để debugging và profiling ứng dụng.
Cấu hình Xdebug
Để sử dụng Xdebug trong Laravel, chúng ta cần cấu hình Xdebug trong file php.ini của PHP.
[Xdebug] zend_extension=xdebug.so xdebug.mode=coverage xdebug.coverage_enable=On xdebug.coverage_output_dir=/path/to/coverage/folder
Trong đó, xdebug.mode=coverage cho biết Xdebug sẽ được sử dụng để đo đạc độ bao phủ của code. xdebug.coverage_enable=On cho biết Xdebug sẽ được kích hoạt để đo đạc độ bao phủ. xdebug.coverage_output_dir cho biết đường dẫn đến thư mục chứa kết quả đo đạc độ bao phủ.
Chạy PHPUnit với Code Coverage
Để chạy PHPUnit với Code Coverage, chúng ta sử dụng option --coverage-html để chỉ định thư mục chứa kết quả đo đạc độ bao phủ.
php artisan test --coverage-html /path/to/coverage/folder
Xem kết quả đo đạc độ bao phủ: Sau khi chạy PHPUnit với Code Coverage, chúng ta có thể mở file index.html trong thư mục kết quả để xem độ bao phủ của code.
Code Coverage giúp chúng ta đo đạc độ bao phủ của test case và tìm ra những vùng code chưa được thực thi trong quá trình testing. Chúng ta có thể sử dụng kết quả đo đạc độ bao phủ để cải thiện test case và đảm bảo độ tin cậy của ứng dụng.
10. Sử dụng PHP-CS-Fixer để kiểm tra và sửa lỗi cú pháp
PHP-CS-Fixer là một công cụ để kiểm tra và sửa lỗi cú pháp trong code PHP, bao gồm cả Laravel. Nó có thể giúp bạn đảm bảo rằng mã nguồn của bạn tuân thủ các quy ước lập trình và đúng cú pháp.
Để sử dụng PHP-CS-Fixer trong Laravel, chúng ta có thể làm như sau:
Cài đặt PHP-CS-Fixer
Chúng ta có thể cài đặt PHP-CS-Fixer thông qua Composer bằng cách chạy lệnh sau:
composer require --dev friendsofphp/php-cs-fixer
Tạo file cấu hình
Chúng ta cần tạo một file cấu hình để định nghĩa các quy ước lập trình và cách sửa lỗi cú pháp.
Ví dụ:
<?php $finder = Symfony\Component\Finder\Finder::create() ->in(__DIR__) ->exclude('vendor') ->name('*.php') ->notName('*.blade.php') ->ignoreDotFiles(true) ->ignoreVCS(true); $config = new PhpCsFixer\Config(); return $config->setRules([ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'no_unused_imports' => true, 'no_unused_imports' => true, 'trailing_comma_in_multiline' => true, 'phpdoc_order' => true, 'blank_line_before_statement' => [ 'statements' => ['return'], ], ])->setFinder($finder);
Trong đó, chúng ta định nghĩa một Finder để tìm kiếm các file PHP trong thư mục hiện tại và không bao gồm các file trong thư mục vendor hoặc có đuôi .blade.php. Chúng ta cũng định nghĩa các quy ước lập trình và cách sửa lỗi cú pháp.
Chạy PHP-CS-Fixer
Để chạy PHP-CS-Fixer, chúng ta sử dụng lệnh sau:
php-cs-fixer fix
Nếu có lỗi cú pháp, PHP-CS-Fixer sẽ cố gắng sửa chúng và hiển thị thông báo lỗi cho bạn. Nếu không có lỗi cú pháp, không có gì được hiển thị.
PHP-CS-Fixer là một công cụ hữu ích để đảm bảo rằng code của bạn tuân thủ các quy ước lập trình và đúng cú pháp. Chúng ta có thể tích hợp nó vào quy trình CI/CD của mình để đảm bảo rằng code của chúng ta luôn đúng cú pháp và dễ đọc.
Kết bài viết
Trong bài viết này, chúng ta đã tìm hiểu về 10 thủ thuật tối ưu quá trình testing trong Laravel. Việc kiểm tra chất lượng sản phẩm phát triển rất quan trọng và đòi hỏi nhiều thời gian và công sức. Tuy nhiên, các thủ thuật này sẽ giúp bạn tiết kiệm thời gian và tăng hiệu quả kiểm tra.
Từ việc sử dụng các bộ kiểm tra tích hợp sẵn của Laravel, cho đến việc sử dụng Laravel Telescope để theo dõi các hoạt động của ứng dụng, và tối ưu hóa các bộ kiểm tra với Mockery, tất cả đều giúp cho quá trình testing trở nên dễ dàng và hiệu quả hơn.
Tuy nhiên, cần lưu ý rằng những thủ thuật này chỉ là một phần nhỏ của quá trình testing và không thể thay thế hoàn toàn cho việc viết các bộ kiểm tra và thực hiện các kiểm tra thủ công. Tuy nhiên, với việc áp dụng các thủ thuật này, bạn sẽ tiết kiệm được thời gian và công sức, và giảm thiểu các sai sót trong quá trình testing của mình.