Beberapa orang berpendapat bahwa tes integrasi semuanya buruk dan salah - semuanya harus diuji unit, yang berarti Anda harus mengejek dependensi; opsi yang, karena berbagai alasan, saya tidak selalu suka.
Saya menemukan bahwa, dalam beberapa kasus, tes unit tidak membuktikan apa-apa.
Mari kita ambil implementasi repositori (sepele, naif) berikut (dalam PHP) sebagai contoh:
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]);
}
}
Katakanlah saya ingin membuktikan dalam pengujian bahwa repositori ini benar-benar dapat menemukan produk yang cocok dengan berbagai kata kunci yang diberikan.
Pendek pengujian integrasi dengan objek koneksi nyata, bagaimana saya bisa tahu bahwa ini sebenarnya menghasilkan permintaan nyata - dan bahwa permintaan itu benar-benar melakukan apa yang saya pikir mereka lakukan?
Jika saya harus mengejek objek koneksi dalam unit-test, saya hanya dapat membuktikan hal-hal seperti "itu menghasilkan permintaan yang diharapkan" - tetapi itu tidak berarti itu benar-benar akan berfungsi ... yaitu, mungkin itu menghasilkan permintaan Saya harapkan, tapi mungkin kueri itu tidak melakukan apa yang saya pikirkan.
Dengan kata lain, saya merasa seperti tes yang membuat pernyataan tentang permintaan yang dihasilkan, pada dasarnya tanpa nilai, karena ini menguji bagaimana findByKeyword()
metode itu diterapkan , tetapi itu tidak membuktikan bahwa itu benar-benar berfungsi .
Masalah ini tidak terbatas pada repositori atau integrasi basis data - tampaknya berlaku dalam banyak kasus, di mana membuat pernyataan tentang penggunaan tiruan (uji-ganda) hanya membuktikan bagaimana hal-hal diterapkan, bukan apakah mereka akan sebenarnya bekerja.
Bagaimana Anda menghadapi situasi seperti ini?
Apakah tes integrasi benar-benar "buruk" dalam kasus seperti ini?
Saya mendapatkan poin bahwa lebih baik untuk menguji satu hal, dan saya juga mengerti mengapa pengujian integrasi mengarah ke banyak jalur kode, yang semuanya tidak dapat diuji - tetapi dalam hal layanan (seperti repositori) yang tujuannya hanya untuk untuk berinteraksi dengan komponen lain, bagaimana Anda bisa benar-benar menguji apa pun tanpa pengujian integrasi?