Phương pháp kiểm tra khác nhau
Đầu tiên xác định những gì bạn đang làm: Kiểm tra đơn vị hoặc kiểm tra tích hợp . Số lượng các lớp không liên quan để kiểm tra đơn vị vì bạn chỉ có thể kiểm tra một lớp. Phần còn lại bạn chế nhạo. Để kiểm thử tích hợp, không thể tránh khỏi việc bạn kiểm tra nhiều lớp. Nếu bạn có các bài kiểm tra đơn vị tốt, mẹo là làm cho các bài kiểm tra tích hợp không quá phức tạp.
Nếu kiểm tra đơn vị của bạn tốt, bạn không phải lặp lại kiểm tra tất cả các chi tiết khi thực hiện kiểm tra tích hợp.
Các thuật ngữ chúng tôi sử dụng, chúng phụ thuộc vào một chút nền tảng, nhưng bạn có thể tìm thấy chúng trong hầu hết các nền tảng thử nghiệm / phát triển:
Ứng dụng ví dụ
Tùy thuộc vào công nghệ bạn sử dụng tên có thể khác nhau, nhưng tôi sẽ sử dụng tên này làm ví dụ:
Nếu bạn có một ứng dụng CRUD đơn giản với mô hình Sản phẩm, Bộ điều khiển Sản phẩm và chế độ xem chỉ mục tạo bảng HTML với các sản phẩm:
Kết quả cuối cùng của ứng dụng là hiển thị bảng HTML với danh sách tất cả các sản phẩm đang hoạt động.
Kiểm tra đơn vị
Mô hình
Mô hình bạn có thể kiểm tra khá dễ dàng. Có nhiều phương pháp khác nhau cho nó; chúng tôi sử dụng đồ đạc. Tôi nghĩ đó là những gì bạn gọi là "bộ dữ liệu giả". Vì vậy, trước khi mỗi bài kiểm tra được chạy, chúng ta tạo bảng và đưa vào dữ liệu gốc. Hầu hết các nền tảng có phương pháp cho việc này. Ví dụ, trong lớp thử nghiệm của bạn, một phương thức setUp () được chạy trước mỗi thử nghiệm.
Sau đó, chúng tôi chạy thử nghiệm của chúng tôi, ví dụ: các sản phẩm testGetAllActive .
Vì vậy, chúng tôi kiểm tra trực tiếp đến một cơ sở dữ liệu thử nghiệm. Chúng tôi không chế nhạo nguồn dữ liệu; chúng tôi làm cho nó luôn luôn giống nhau. Điều này cho phép chúng tôi lấy ví dụ để kiểm tra phiên bản mới của cơ sở dữ liệu và mọi vấn đề truy vấn sẽ xuất hiện.
Trong thế giới thực, bạn không thể luôn tuân theo trách nhiệm 100% . Nếu bạn muốn làm điều này tốt hơn nữa, bạn có thể sử dụng một nguồn dữ liệu mà bạn giả định. Đối với chúng tôi (chúng tôi sử dụng ORM) có cảm giác như đang thử nghiệm công nghệ hiện có. Ngoài ra các bài kiểm tra trở nên phức tạp hơn nhiều và chúng không thực sự kiểm tra các truy vấn. Vì vậy, chúng tôi giữ nó theo cách này.
Dữ liệu được mã hóa cứng được lưu trữ riêng trong đồ đạc. Vì vậy, vật cố giống như một tệp SQL với câu lệnh tạo bảng và chèn cho các bản ghi chúng ta sử dụng. Chúng tôi giữ chúng nhỏ trừ khi có nhu cầu thực sự để kiểm tra với nhiều hồ sơ.
class ProductModel {
public function getAllActive() {
return $this->find('all', array('conditions' => array('active' => 1)));
}
}
Bộ điều khiển
Bộ điều khiển cần nhiều công việc hơn, vì chúng tôi không muốn thử nghiệm mô hình với nó. Vì vậy, những gì chúng tôi làm là chế nhạo mô hình. Điều đó có nghĩa là: Chúng tôi kiểm tra: phương thức index () sẽ trả về một danh sách các bản ghi.
Vì vậy, chúng tôi mô phỏng phương thức mô hình getAllActive () và thêm dữ liệu cố định trong đó (ví dụ hai bản ghi). Bây giờ chúng tôi kiểm tra dữ liệu mà bộ điều khiển gửi đến chế độ xem và chúng tôi so sánh nếu chúng tôi thực sự lấy lại được hai bản ghi đó.
function testProductIndexLoggedIn() {
$this->setLoggedIn();
$this->ProductsController->mock('ProductModel', 'index', function(return array(your records) ));
$result=$this->ProductsController->index();
$this->assertEquals(2, count($result['products']));
}
Thế là đủ rồi. Chúng tôi cố gắng thêm ít chức năng vào bộ điều khiển vì điều đó làm cho việc kiểm tra khó khăn. Nhưng tất nhiên luôn có một số mã trong đó. Ví dụ: chúng tôi kiểm tra các yêu cầu như: Chỉ hiển thị hai bản ghi đó nếu bạn đã đăng nhập.
Vì vậy, bộ điều khiển cần một giả bình thường và một phần nhỏ dữ liệu được mã hóa cứng. Đối với một hệ thống đăng nhập có thể một cái khác. Trong thử nghiệm của chúng tôi, chúng tôi có một phương thức trợ giúp cho nó: setLoggedIn (). Điều đó làm cho nó đơn giản để kiểm tra với đăng nhập hoặc không có đăng nhập.
class ProductsController {
public function index() {
if($this->loggedIn()) {
$this->set('products', $this->ProductModel->getAllActive());
}
}
}
Lượt xem
Kiểm tra lượt xem là khó. Đầu tiên chúng tôi tách ra logic mà lặp lại. Chúng tôi đưa nó vào Helpers và kiểm tra các lớp đó một cách nghiêm ngặt. Chúng tôi hy vọng luôn luôn cùng một đầu ra. Ví dụ: createdHtmlTableFromArray ().
Sau đó, chúng tôi có một số quan điểm cụ thể của dự án. Chúng tôi không kiểm tra những cái đó. Nó không thực sự mong muốn để kiểm tra đơn vị những người. Chúng tôi giữ chúng cho các bài kiểm tra tích hợp. Bởi vì chúng tôi đã đưa ra rất nhiều mã vào các lượt xem nên chúng tôi có rủi ro thấp hơn ở đây.
Nếu bạn bắt đầu thử nghiệm những thứ bạn có thể cần thay đổi thử nghiệm của mình mỗi khi bạn thay đổi một đoạn HTML không hữu ích cho hầu hết các dự án.
echo $this->tableHelper->generateHtmlTableFromArray($products);
Thử nghiệm hội nhập
Tùy thuộc vào nền tảng của bạn ở đây, bạn có thể làm việc với các câu chuyện của người dùng, v.v. Nó có thể được dựa trên web như Selenium hoặc các giải pháp tương đương khác.
Nói chung, chúng tôi chỉ tải cơ sở dữ liệu với các đồ đạc và xác nhận dữ liệu nào sẽ có sẵn. Để kiểm tra tích hợp đầy đủ, chúng tôi thường sử dụng các yêu cầu rất toàn cầu. Vì vậy: Đặt sản phẩm thành hoạt động và sau đó kiểm tra xem sản phẩm có khả dụng không.
Chúng tôi không kiểm tra mọi thứ một lần nữa, như liệu các trường bên phải có sẵn hay không. Chúng tôi kiểm tra các yêu cầu lớn hơn ở đây. Vì chúng tôi không muốn sao chép các thử nghiệm của mình từ bộ điều khiển hoặc chế độ xem. Nếu một cái gì đó thực sự là phần chính / cốt lõi của ứng dụng của bạn hoặc vì lý do bảo mật (kiểm tra mật khẩu KHÔNG khả dụng) thì chúng tôi sẽ thêm chúng để đảm bảo đúng.
Dữ liệu được mã hóa cứng được lưu trữ trong đồ đạc.
function testIntegrationProductIndexLoggedIn() {
$this->setLoggedIn();
$result=$this->request('products/index');
$expected='<table';
$this->assertContains($expected, $result);
// Some content from the fixture record
$expected='<td>Product 1 name</td>';
$this->assertContains($expected, $result);
}