Một số người duy trì rằng các bài kiểm tra tích hợp là tất cả các loại xấu và sai - mọi thứ phải được kiểm tra theo đơn vị, có nghĩa là bạn phải chế giễu các phụ thuộc; một lựa chọn mà, vì nhiều lý do, tôi không phải lúc nào cũng thích.
Tôi thấy rằng, trong một số trường hợp, một bài kiểm tra đơn vị đơn giản là không chứng minh được điều gì.
Hãy lấy cách triển khai kho lưu trữ (tầm thường, ngây thơ) sau đây (trong PHP) làm ví dụ:
class ProductRepository
{
private $db;
public function __construct(ConnectionInterface $db) {
$this->db = $db;
}
public function findByKeyword($keyword) {
// this might have a query builder, keyword processing, etc. - this is
// a totally naive example just to illustrate the DB dependency, mkay?
return $this->db->fetch("SELECT * FROM products p"
. " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
}
}
Giả sử tôi muốn chứng minh trong một thử nghiệm rằng kho lưu trữ này thực sự có thể tìm thấy các sản phẩm phù hợp với các từ khóa khác nhau.
Thiếu kiểm tra tích hợp với một đối tượng kết nối thực, làm sao tôi có thể biết rằng điều này thực sự tạo ra các truy vấn thực - và những truy vấn đó thực sự làm những gì tôi nghĩ họ làm?
Nếu tôi phải giả định đối tượng kết nối trong một bài kiểm tra đơn vị, tôi chỉ có thể chứng minh những thứ như "nó tạo ra truy vấn mong đợi" - nhưng điều đó không có nghĩa là nó thực sự sẽ hoạt động ... đó là, có thể nó đang tạo ra truy vấn Tôi đã mong đợi, nhưng có lẽ truy vấn đó không làm những gì tôi nghĩ.
Nói cách khác, tôi cảm thấy giống như một thử nghiệm đưa ra các xác nhận về truy vấn được tạo, về cơ bản là không có giá trị, bởi vì nó kiểm tra cách findByKeyword()
thức phương thức được thực hiện , nhưng điều đó không chứng minh rằng nó thực sự hoạt động .
Vấn đề này không giới hạn ở kho lưu trữ hoặc tích hợp cơ sở dữ liệu - nó dường như được áp dụng trong rất nhiều trường hợp, trong đó việc đưa ra các xác nhận về việc sử dụng giả (test-double) chỉ chứng minh cách mọi thứ được thực hiện, chứ không phải là chúng sẽ xảy ra thực sự làm việc
Làm thế nào để bạn đối phó với các tình huống như thế này?
Các thử nghiệm tích hợp có thực sự "xấu" trong trường hợp như thế này không?
Tôi nhận thấy rằng nên kiểm tra một điều tốt hơn và tôi cũng hiểu tại sao kiểm thử tích hợp dẫn đến vô số đường dẫn mã, tất cả đều không thể được kiểm tra - nhưng trong trường hợp dịch vụ (chẳng hạn như kho lưu trữ) chỉ có mục đích là để tương tác với một thành phần khác, làm thế nào bạn thực sự có thể kiểm tra bất cứ điều gì mà không cần kiểm tra tích hợp?