Niektórzy twierdzą, że testy integracyjne są wszelkiego rodzaju złe i złe - wszystko musi być testowane jednostkowo, co oznacza, że musisz kpić z zależności; opcja, która z różnych powodów nie zawsze mi się podoba.
Uważam, że w niektórych przypadkach test jednostkowy po prostu niczego nie dowodzi.
Jako przykład weźmy następującą (trywialną, naiwną) implementację repozytorium (w PHP):
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]);
}
}
Powiedzmy, że chcę udowodnić w teście, że to repozytorium może faktycznie znaleźć produkty pasujące do różnych podanych słów kluczowych.
Bez testowania integracji z rzeczywistym obiektem połączenia, skąd mam wiedzieć, że generuje to prawdziwe zapytania - i że te zapytania faktycznie robią to, co myślę?
Jeśli muszę kpić z obiektu połączenia w teście jednostkowym, mogę tylko udowodnić, że „generuje oczekiwane zapytanie” - ale to nie znaczy, że faktycznie zadziała ... to znaczy, może generuje zapytanie Spodziewałem się, ale może to zapytanie nie robi tego, co myślę, że działa.
Innymi słowy, czuję się jak test, który wysuwa twierdzenia na temat wygenerowanego zapytania, jest w zasadzie bez wartości, ponieważ testuje sposób implementacjifindByKeyword()
metody , ale to nie dowodzi, że faktycznie działa .
Ten problem nie ogranicza się do repozytoriów lub integracji bazy danych - wydaje się, że ma zastosowanie w wielu przypadkach, w których stwierdzenia dotyczące użycia próbnego (podwójnego testu) tylko dowodzą, jak rzeczy są realizowane, a nie czy zamierzają faktycznie działa.
Jak sobie radzisz w takich sytuacjach?
Czy testy integracyjne są naprawdę „złe” w takim przypadku?
Rozumiem, że lepiej przetestować jedną rzecz, a także rozumiem, dlaczego testowanie integracji prowadzi do niezliczonych ścieżek kodu, z których wszystkie nie mogą być testowane - ale w przypadku usługi (takiej jak repozytorium), której jedynym celem jest w celu interakcji z innym komponentem, w jaki sposób można naprawdę przetestować coś bez testowania integracji?