Giới thiệu Codeception

Thường thì trong quy trình phát triển phần mềm luôn luôn có phần testing, trong phát triển sản phẩm trên nền tảng PHP cũng vậy và như chúng ta biết PHP có một Framework testing tuyệt
vời đó là PHPUnit test nhưng nó cũng có những tính năng giới hạn như cho testing functional với Selenium hoặc 1 thành phần backend khác. Vì vậy hôm nay chúng tôi sẽ giói thiệu các bạn
Framework testing có đầy đủ của một PHPUnit testing và những tính năng khác mà PHPunit testing không có đó là Codeception. Toàn bộ mã nguồn để test bạn có thể download tại đây

Codeception

Vậy Codeception là gì: Theo định nghĩa trên Website là một FW testing PHP hiện đại có ba tính năng testing chính functional, acceptance and unit tests chúng ta sẽ thảo luận nó ngay sau đây !!

Function Testing

Là kiểu test liệu mỗi và mọi chức năng của ứng dụng đó đang làm việc có như yêu cầu của tài liệu. Nó là kiểu test chính mà 80% công việc test được thực hiện. Trong kiểu test này thì các testcase được thực hiện (hoặc thi hành), bạn có thể xem tại đây.

Test Unit Là Gì?

Là kiểu test kiểm tra code xem liệu chức năng nó đang thực hiện có đúng cách hay không theo như yêu cầu, chú ý rằng Codeception sử dụng PHPUnit test do đó bất cứ đoạn code test nào chạy trên PHPUnit đều có thể chạy trên Codeception, bạn có thể xem tại đây.

Acceptance Testing

Kiểm tra hệ thống phần mềm ở mức hệ thống như anpha, beta,… xem phần mềm có đáp ứng được mong muốn của người dùng chưa. Khi khách hàng nhận được phần mềm, họ phải thuê người hoặc cho các nhân viên sử dụng trực tiếp sản phẩm => xem nó đáp ứng công việc của họ chưa, có lỗi gì không, bạn có thể xem tại đây

Cài Đặt

Việc cài đặt không thể dễ dàng hơn, bạn có thể dùng Composer hoặc thông qua Phar, trong ví dụ này chúng tôi sẽ dùng Phar nhưng trong thực tế chúng ta nên dùng composer để có thể cập nhật
bản mới nhất một cách dễ dàng

wget http://codeception.com/codecept.phar

Khởi Tạo Cấu Trúc Testing (Bootstrapping)

Để tạo cấu trúc của thư mục testing trong Codeception bạn chỉ cần chạy lệnh dưới đây trong thư mục app của bạn

php codecept.phar bootsrap

Sau khi chạy lệnh trên cấu trúc thư mục tests có dạng như sau:

apps/
[...]
tests/
_data/
functional/
acceptance/
unit/
acceptance.suite.yml
functional.suite.yml
unit.suite.yml

[...]

Cách Sử Dụng

Để tạo một tập tin cho các trường hợp test case bạn chạy lệnh sau đây:

php codecept.phar generate:cept {type} {name}

Trong đó type có thể là functional, acceptance, unit  và name là tên tập tin mà bạn muốn đặt ví dụ chúng tôi cần test kiểu là functional với tập tin là login thì chạy
lệnh sau:

php codecept.phar generate:cept functional login

thì trong thư mục tests/functional sẽ có tập tin là loginCept.php chú ý là hậu tố Cept nó tự động thêm vào mục đích là cho ta biết ý nghĩa của tập tin đó là gì thôi, mở tập tin đó lên
sẽ có nội dung sau:

<?php
$I = new FunctionalTester($scenario);
$I->wantTo('perform actions and see result');

tương tự bạn có thế áp dụng cho unitacceptance, để chạy test nó bạn chỉ cần chạy lệnh sau đây:

php codecept.phar run

nếu bạn muốn hiển thị thông tin lỗi khi chạy test bạn chỉ cần thêm tham số debug

php codecept.phar run --debug

nếu bạn chỉ muốn test duy nhất loại là functional thì chỉ cần chạy lệnh sau:

php codecept.phar run functional --debug

ok, cho tới bây giờ tôi đã giới thiệu cơ bản về Codeception sau đây ta sẽ áp dụng nó vào một FW PHP và trong trường hợp này tôi sẽ áp dụng nó cho FW Phalcon PHP

Codeception Với Phalcon PHP

Chúng tôi giả sử bạn đã cài Phalcon PHP nếu không bạn có thể xem hướng dẫn cài đạt nó tại đây và bạn cần có một ứng dụng chạy Phalcon nếu không có bạn có thể lấy mã nguồn Phalcontip.com

Sau khi có mọi thứ bạn mở tập tin functional.suite.yml để thêm modules Phalcon như sau:

# Codeception Test Suite Configuration
# suite for functional (integration) tests.
# emulate web requests and make application process them.
# Include one of framework modules (Symfony2, Yii2, Laravel4, Phalcon1) to use it.

class_name: TestGuy
modules:
enabled: [Filesystem, Phalcon1, TestHelper, PhpBrowser]
config:
Phalcon1:
bootstrap: app/config/bootstrap.php
cleanup: true
savepoints: true
PhpBrowser:
url: 'http://phalcontip.dev'
curl:
CURLOPT_RETURNTRANSFER: true

Ở đây class_name TestGuy sẽ là cái class được sinh ra tự động nó bao gồm các phương thức tương tác với Phalcon, còn ở mục modules chúng tôi sử dụng
bốn modules của Codeception cung cấp, để xem đầy đủ tính năng modules của nó bạn xem tại đây
do chúng tôi test trên Phalcon nên khai báo ở phần config là Phalcon1 chú ý rằng số 1 ở đây là phiên bản của Phalcon còn nếu bạn dùng
Laravel thì ở phần config có thể là Laravel4 hoặc Laravel5.

Ta đã cấu hình song bây giờ ta hãy viết một testcase đơn giản để kiểm tra xem có thấy trang login hay không, bạn chạy lệnh sau đây để tạo tập tin
tự động

php codecept.phar generate:cept functional HomePage

sau đó bạn mở tập tin để đó lên nó nội dung như bên dưới đây:

<?php
$I = new TestGuy($scenario);
$I->wantTo('perform actions and see result');

ok, giả sử chúng ta muốn kiểm tra ở trang chủ(homepage)  có đường dẫn đăng nhập với tên là Log In with Github hay không ta sẽ sữa nó như sau:

<?php
$I = new TestGuy($scenario);
$I->wantTo('Verify that the home page wellcome me');
$I->amOnPage('/');
$I->see('Log In with Github');

tiếp đến ta sẽ chạy lệnh sau để testing

$ php codecept.phar run functional tests/functional/HomePageCept.php
Codeception PHP Testing Framework v2.0.12
Powered by PHPUnit 4.5.1 by Sebastian Bergmann and contributors.

Functional Tests (1) ------------------------------------------------------------------------------------------------------------
Verify that the home page wellcome me (HomePageCept)                                                                       Error
---------------------------------------------------------------------------------------------------------------------------------


Time: 108 ms, Memory: 6.75Mb

There was 1 error:

---------
1) Failed to verify that the home page wellcome me in HomePageCept (/home/duythien/github/phalcon-tip/tests/functional/HomePageCept.php)
Can't be on page "/":
GuzzleHttp\Exception\ConnectException: cURL error 7: Failed to connect to phalcontip.dev port 80: Connection refused

Scenario Steps::
1. I am on page "/"

#1  Codeception\Module\PhpBrowser->amOnPage
#2  /home/duythien/github/phalcon-tip/tests/functional/TestGuy.php:550
#3  /home/duythien/github/phalcon-tip/tests/functional/HomePageCept.php:4
#4  Codeception\TestCase\Cept->testCodecept
#5  /home/duythien/github/phalcon-tip/codecept.phar:7

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

Oh, có lỗi xảy ra và như lỗi ở trên là do tôi chưa khởi động website, bạn chỉ cần khởi động apache sau đó chạy lệnh testing ở trên
thì có kết quả như dưới đây:

$ php codecept.phar run functional tests/functional/HomePageCept.php
Codeception PHP Testing Framework v2.0.12
Powered by PHPUnit 4.5.1 by Sebastian Bergmann and contributors.

Functional Tests (1) ------------------------------------------------------------------------------------------------------------
Verify that the home page wellcome me (HomePageCept)                                                                       Ok
---------------------------------------------------------------------------------------------------------------------------------


Time: 803 ms, Memory: 6.75Mb

OK (1 test, 1 assertion)

Awesome, nó đã chạy và cho kết quả đúng, giả sử tôi thây đổi chử Login In with Gihub thành Đăng nhập thì bạn sẽ nhận lỗi sau:

$ php codecept.phar run functional --debug tests/functional/HomePageCept.php
Codeception PHP Testing Framework v2.0.12
Powered by PHPUnit 4.5.1 by Sebastian Bergmann and contributors.

Functional Tests (1) ------------------------------------------------------------------------------------------------------------
Modules: Filesystem, Phalcon1, TestHelper, PhpBrowser
---------------------------------------------------------------------------------------------------------------------------------
Verify that the home page wellcome me (HomePageCept)
Scenario:
* I am on page "/"

[Response] 200
[Page] http://phalcontip.dev
[Cookies] []
[Headers] {"Server":["nginx/1.4.7,"Date":["Thu, 16 Apr 2015 06:21:30 GMT,"Content-Type":["text/html;charset=utf-8,"Transfer-Encoding":["chunked,"Connection":["keep-alive,"X-Powered-By":["PHP/5.5.17,"Set-Cookie":["PHPSESSID=2mkm368vraoapcnnk7s6pqg1b2; path=/,"Expires":["Thu, 19 Nov 1981 08:52:00 GMT,"Cache-Control":["no-store, no-cache, must-revalidate, post-check=0, pre-check=0,"Pragma":["no-cache}
* I see "Đăng nhập"
FAIL

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
---------------------------------------------------------------------------------------------------------------------------------


Time: 714 ms, Memory: 6.75Mb

There was 1 failure:

---------
1) Failed to verify that the home page wellcome me in HomePageCept (/home/duythien/github/phalcon-tip/tests/functional/HomePageCept.php)
Couldn't see "Đăng nhập":
Failed asserting that
--> <!DOCTYPE html>
<html lang="en">
<head>

<title>Tips - Phalcon Tips</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link rel="canonical" href="http://phalcontip.dev/"/><link rel="author" hre
[Content too long to display. See complete response in '_output' directory]
--> contains "Đăng nhập".

Scenario Steps:
2. I see "Đăng nhập"
1. I am on page "/"


FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

Giả sử bây giờ bạn thấy trang login sau đó bạn login, thì chúng ta muốn nhìn thấy Profile của user đó bạn chỉ cần thêm đoạn code như dưói đây

<?php
$I = new TestGuy($scenario);
$I->wantTo('Verify that the home page wellcome me');
$I->amOnPage('/');
$I->see('Log In with Github');
$I->click('Log In with Github');
$I->see('Profile');

chạy lại lệnh testing ở trên ta có kết quả như sau:

$ php codecept.phar run functional tests/functional/HomePageCept.php
Codeception PHP Testing Framework v2.0.12
Powered by PHPUnit 4.5.1 by Sebastian Bergmann and contributors.

Functional Tests (1) ------------------------------------------------------------------------------------------------------------
Verify that the home page wellcome me (HomePageCept)                                                                       Ok
---------------------------------------------------------------------------------------------------------------------------------


Time: 2.06 seconds, Memory: 6.75Mb
OK (1 test, 2 assertions)

để biết những thuộc tính của Phalcon có trong Codeception bạn có thể xem tại đây

Kết Luận

Trên đây chúng tôi đã giới thiệu căn bản về Codeception và tích hợp nó với Phalcon PHP, như bạn thấy việc viết test case trên Codeception
không thể dễ dàng hơn, tùy nhu cầu cụ thể của dự án mà chúng ta áp dụng nó vào. Trên đây là trải nghiệm của chúng tôi về nó, nếu bạn có bất kỳ
cầu hỏi nào xin hãy bình luận bên dưới, và như mọi khi nếu thấy bài viết hay hãy chia sẽ nó với bạn bè của bạn !!!

Leave a Reply

Your email address will not be published. Required fields are marked *