Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Testing
Code

Lập trình với Yii2: Kiểm tra tự động với Codeception

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called How to Program With Yii2.
Programming With Yii2: Security
How to Program With Yii2: ActiveRecord

Vietnamese (Tiếng Việt) translation by Andrea Ho (you can also view the original English article)

Final product image
What You'll Be Creating

Nếu bạn đang hỏi "Yii là gì?", thì hãy xem hướng dẫn trước của tôi Introduction to the Yii framework - để biết được lợi ích của Yii và tổng quan có gì mới ở Yii 2.0, phát hành vào tháng 10 2014.

Trong loạt bài Programming with Yii2 - Lập trình cùng Yii2, tôi hướng dẫn các bạn sử dụng framework Yii2 của PHP. Trong hướng dẫn này, tôi sẽ khám phá chủ đề test tự động bằng Codeception, được tích hợp với framework Yii2.

Phải thừa nhận rằng, kinh nghiệm viết về tests của tôi thực sự hiếm hoi. Tôi thường tham gia các dự án một mình hoặc quy mô nhỏ với nguồn lực hạn chế. Trong suốt thời gian làm việc tại Microsoft, chúng tôi có những đội ngũ test riêng biệt đảm nhậm việc này. Nhưng thẳng thắn mà nói điều này có thể là điển hình với cả bạn quá, phải không? Các lập trình viên thích code, họ không viết test - ít nhất là các lập trình viên ngày xưa không làm thế.

Codeception là một thư viện đầy sáng tạo theo nghĩa đen nhằm mục đích làm cho các bài test viết vui vẻ và dễ dàng. Và tôi muốn nói rằng họ đã thành công ở mức độ vừa phải. Khi tôi thận trọng bắt đầu trải nghiệm vào hồ nước của Codeception, thật sự dễ dàng và thú vị. Tuy nhiên, khi tôi bắt đầu đi tiến xa hơn, tôi đã gặp phải vấn đề về cấu hình với Yii và các mô-đun cụ thể được sử dụng trong loạt bài này. Chắc chắn có những thách thức. Nhìn chung, dù tôi rất ấn tượng và nhìn thấy lợi ích của việc học hỏi nhiều hơn.

Đơn giản mà nói, Codeception và tích hợp của nó với Yii khiến tôi muốn viết test nhiều hơn. Tôi hoài nghi bạn sẽ có một trải nghiệm tương tự.

Một nhắc nhở nhỏ trước khi chúng ta bắt đầu, tôi luôn tham gia vào các chủ đề bình luận phía dưới. Tôi đặc biệt hứng thú nếu bạn có suy nghĩ hoặc muốn đề xuất các chủ đề cho hướng dẫn trong tương lai. Nếu bạn có câu hỏi hoặc chủ đề đề xuất, xin vui lòng đăng ở bên dưới. Bạn cũng có thể liên hệ trực tiếp với tôi trên Twitter @reifman.

Bắt đầu nào

Cài đặt Codeception

Tôi đã sử dụng tài liệu Yii's Testing Environment Setup - Hướng dẫn cài đặt môi trường test của Yii. Tôi bắt đầu với bản cài đặt toàn cục của codeception để tôi có thể sử dụng nó cho bất kỳ dự án nào.

Bạn cũng cần có codeception/specify:

codeception/verify:

Tiếp theo, nó giúp thiết lập alias cho codecept bằng cách sử dụng thư mục toàn cục composer:

Phần này thiết lập alias:

Yii cũng cần cài đặt Faker để tạo dữ liệu giả để test ứng dụng của bạn:

Thiết lập Codeception với ứng dụng của bạn

Codecept bootstrap khởi tạo codeception cho ứng dụng Yii của bạn. Lệnh này tạo ra một loạt các file cấu hình để xây dựng và chạy test đối với ứng dụng của bạn. Chúng tôi đang sử dụng ứng dụng Hello từ loạt bài này. Xem liên kết GitHub trên trang này để lấy code.

Vì vài lý do, tôi cũng đã sao chép các thư mục test trùng lặp trong hello / tests; chỉ cần xóa hello / tests / functional, hello / tests / accept, và hello / tests / unit xóa mọi thứ. Tất cả các bài test đều có trong thư mục hello/tests/codeception/*.

Các loại hình test khác nhau

Codeception tập trung vào ba loại hình test:

  1. Unit testing xác thực các đơn vị cụ thể đang hoạt động, chẳng hạn như test toàn diện tất cả các phương thức trong model của bạn.
  2. Functional testing xác thực các kịch bản ứng dụng phổ biến giống như được thực hiện từ phía người dùng, nhưng bằng cách sử dụng trình mô phỏng trình duyệt web.
  3. Acceptance testing giống y như functional testing nhưng chạy test thông qua trình duyệt web thực sự.

Và Codeception hỗ trợ ba loại hình test khác nhau cho code test của bạn:

  1. Cept: đây là file test cho kịch bản đơn giản nhất
  2. Cest: một định dạng hướng đối tượng để chạy nhiều test trong một file duy nhất
  3. Test: các bài test được viết trên PHPUnit, một framework dùng cho mục đích test của PHP.

Hãy bắt đầu với ví dụ về các acceptance tests có sử dụng cept format (định dạng):

Acceptance Testing

Trước tiên, chúng tôi sẽ sử dụng ví dụ test Welcome của Codeception.

Ví dụ này tạo ra các bài tests/acceptance/WelcomeCept.php, mà chúng tôi sẽ chỉnh sửa bên dưới.

Vì các acceptance test cần có trình duyệt, chúng tôi phải chỉnh sửa file /tests/acceptance.suite.yml trong dự án của chúng tôi để cung cấp URL trang chúng tôi đang phát triển, http://localhost:8888/hello:

Bây giờ, chúng ta đã sẵn sàng để sửa đổi bài test đầu tiên trong các bài tests/acceptance/WelcomeCept.php. Tôi đang viết bài test dùng tải trang font-page để đảm bảo rằng mọi thứ hoạt động theo ý muốn.

Các bài test của Codeception có khái niệm về actor, trong trường hợp này là $I = new AcceptanceTester().

Đây là mô tả về actor trong tài liệu Codeception:

Chúng ta có UnitTester để xử lý các hàm và kiểm tra code. Chúng ta cũng có FunctionalTester, một trình test hội đủ điều kiện để test toàn bộ ứng dụng, với các hiểu biết bên trong của nó. Và AcceptanceTester để dùng làm việc với ứng dụng của chúng tôi thông qua một giao diện do chúng tôi cung cấp.

Bạn có thể nhận xét các bài test của mình bằng code, chẳng hạn như $I->wantTo('perform a certain test') hoặc 'ensure that the frontpage works'.

Trong test của tôi, tôi muốn nội dung $I->see'Congratulations''Yii-powered':

Đây là trang chủ hiện tại của Hello:

Programming with Yii - The Hello Home Page

Tiếp theo, hãy chạy test, đơn giản là codecept run:

Như bạn có thể thấy, test của chúng tôi đã vượt qua thành công và code để xác minh chức năng này tương đối dễ đọc và đơn giản.

Ghi chú về các bài test mặc định của Yii

Để tiếp tục, tôi bắt đầu sử dụng các bài test mặc định của Yii. Tại thời điểm này, tôi đã gặp phải một số vấn đề về cấu hình - hầu hết là do tôi sử dụng mô-đun yii2-user tự dựng trong loạt bài này. Những vấn đề khác phát sinh từ các lỗi nhỏ với Yii, đội ngũ Yii đã nhanh chóng phản hồi và sửa lỗi khi nhận báo cáo trên GitHub; trong một số trường hợp, các vấn đề đã được khắc phục trong các phiên bản sau của yii2-basic tree.

Ngoài ra, vì tôi đã cập nhật yii2-basic tree cho loạt bài này nên tôi phải thực hiện một số thay đổi nhỏ cho những bài test mặc định.

Dưới đây là ví dụ kết quả để chạy acceptance test mặc định khi tôi đã thực hiện một số điều chỉnh nhỏ:

Functional Testing

Để test chức năng hoạt động, tôi cần chạy một đối tượng máy chủ tích hợp sẵn của Yii. Tôi đã không biết về thành phần này cho đến khi Alex Markov của Yii đề cập đến nó trong cuộc trao đổi GitHub của chúng tôi.

Tôi đã thực hiện các thay đổi nhỏ cho các bài functional test trong /tests/codeception/functional, chủ yếu để tìm các chuỗi văn bản cụ thể đã được cập nhật, ví dụ như "mật khẩu hoặc đăng nhập lỗi" thay cho mặc định của Yii. Cùng xem lại LoginCept.php:

Về cơ bản, code truy xuất vào model LoginForm và test các phương thức khác nhau của model này bằng cách sử dụng Yii serve.

Đây là code test /tests/codeception_pages/LoginPage.php mà nó đang tận dụng (tôi cũng phải sửa đổi nó cho những thay đổi mà chúng tôi đã thực hiện cho loạt bài này):

Bạn có thể thấy rằng chúng tôi đang code actor thành fillFields và các nút click cho các trường biểu mẫu đã cập nhật.

Trong lúc khắc phục sự cố gặp phải khi tích hợp Codeception với Yii, tôi thấy thật hữu ích khi chạy các test này ở chế độ verbose:

Đây là kết quả verbose từ các bài functional test chức năng đăng nhập — trong Terminal của MacOS, PASSED và FAILED có màu đỏ hoặc hồng và bị đảo ngược để hiển thị:

Nói chung, cần phải học để bắt đầu với Codeception và code đúng cho test của bạn. Nhưng kết quả thật ấn tượng và hữu dụng.

Unit Testing

Về cơ bản, unit test là test có lập trình của các model của chúng tôi. Lý tưởng nhất, chúng tôi sẽ viết test cho mọi phương thức và biến thể sử dụng của model của chúng tôi.

Thật không may, tôi đã không thể khiến unit test làm việc trong tree của chúng tôi vì một trong hai lỗi nhỏ của Yii chưa được công bố hoặc các vấn đề cấu hình giữa Codeception và yii2-user mà chúng tôi tích hợp trong How to Program With Yii2: Integrating User Registration.

Tôi sẽ giải quyết vấn đề unit test một lần nữa trong loạt bài Startup của chúng tôi, ở đó không sử dụng yii2-user mà thay vào đó sử dụng tích hợp người dùng tích hợp sẵn của cây Nâng cao Yii.

Hãy xem xét một vài ví dụ từ Yii2-app-basic tree.

Kiểm tra Email biểu mẫu liên hệ

Các bài test hello/tests/codeception/unit/models/ContactFormTest.php gửi email thông qua việc lập trình của các model.

Tôi đã không vượt qua bài test này vì có một lỗi nhỏ trong Yii chưa được cập nhật (hoặc ít nhất tôi không thể tìm thấy code cập nhật). Sự sụt giảm của Yii codebase đã đặt tên cho email gửi đi với date stamp và code ở trên tìm kiếm một tên file cố định. Do đó, test này luôn thất bại. Tuy nhiên, thật hữu ích khi nhìn thấy cách bài test bằng lập trình có thể sử dụng các model để tạo ra một file và sau đó tìm file đó và xác thực nội dung của file để xác nhận rằng code đó đang hoạt động.

Kiểm tra Đăng nhập

Hãy xem file hello/tests/codeception/unit/models/LoginFormTest.php. Thêm một lần nữa, việc sử dụng yii2-user của tôi gây khó khăn khi tích hợp tại thời điểm viết hướng dẫn này; tuy nhiên, chúng ta có thể xem xét cách tiếp cận khái niệm đối với các hàm unit testing của model user.

Đây là hàm testLoginCorrect(), có vẻ để xem liệu đăng nhập có thành công với mật khẩu chính xác hay không:

Hàm này sử dụng model LoginForm để đăng nhập bằng lập trình cho người dùng, và sau đó nó lập trình trông để xem liệu người dùng hiện tại của Yii bây giờ không còn là khách nữa không.

Tiếp theo là gì?

Tôi hy vọng rằng bạn thích học về Codeception và cách nó tích hợp với Yii, dù tôi đã gặp phải một số rào cản. Phần cài đặt mặc định của yii2-basic giờ đã tốt hơn.

Nếu bạn muốn đọc thêm về chủ đề khi nào và cái gì cần test và lý do tại sao, tôi đề nghị bạn nên đọc bài Yii's Testing Overview. Chắc chắn sẽ có nhiều về Codeception để học và viết nhiều test hoàn thiện hơn.

Theo dõi các hướng dẫn sắp tới trong loạt bài Programming with Yii2 khi chúng tôi tiếp tục đào sâu vào các khía cạnh khác nhau của framework. Nếu bạn muốn biết khi nào hướng dẫn tiếp theo của Yii2 đến, hãy theo dõi tôi @reifman trên Twitter hoặc xem qua trang hướng dẫn của tôi.

Bạn cũng có thể muốn xem loạt bài Building Your Startup with PHP của tôi, ở đó sử dụng các template nâng cao của Yii2 khi chúng tôi xây dựng một ứng dụng thực tế. Trong thực tế, bạn có thể thử ứng dụng startup, Meeting Planner ngay hôm nay.

Liên kết liên quan

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.