sql >> Databáze >  >> RDS >> PostgreSQL

PHPUnit:Jak testovat databázové interakce na vzdáleném serveru Postgres?

Krátkou odpovědí je Přečtěte si položku Fine Manual o testování databáze v příručce PHPUnit .

A teď dlouhá odpověď...

První věc, kterou si o testování jednotek zapamatujte, je, že je třeba jej provádět izolovaně ze všech ostatních složek. Tento cíl je často zjednodušen pomocí technik inverze řízení (IoC), jako je injekce závislosti . Když vaše třídy výslovně požádají o své závislosti v metodách konstruktoru, je to jednoduchá operace pro zesměšňovat tyto závislosti, abyste mohli testovat zbývající kód izolovaně.

Testovací kód, který interaguje s modely, je však trochu jiný. Obvykle není praktické ani vhodné vkládat své modely do třídy, ve které k nim potřebujete mít přístup. Vaše modely jsou obecně „hloupé“ datové struktury, které odhalují omezené nebo žádné schopnosti. Výsledkem je, že je obecně přijatelné (z hlediska testovatelnosti) vytvářet instanci vašich modelů za běhu v rámci vašich jinak vložených tříd. Bohužel to ztěžuje testování kódu databáze, protože, jak uvádí dokumentace PHPUnit:

Jak tedy izolovat a otestovat kód, který interaguje s databází, pokud modely nejsou přímo vloženy? Nejjednodušší způsob, jak toho dosáhnout, je použít testovací zařízení .

Protože už určitě používáte PDO nebo knihovnu ORM, která staví na PDO (že?), nastavení svítidel je stejně jednoduché jako osazení základní databáze SQLite nebo souboru XML daty pro vaše testovací případy a použití tohoto speciálního databázového připojení, když testujete kód, který interaguje s databází. Toto připojení byste mohli specifikovat ve svém bootstrap souboru PHPUnit, ale pravděpodobně je sémanticky vhodnější nastavit Testovací případ databáze PHPUnit .

Obecně přijímané osvědčené postupy pro testování kódu DB (tyto jsou také uvedeny v dokumentaci PHPUnit o testování DB):

  1. Nastavení zařízení
  2. Cvičební systém je testován
  3. Ověřte výsledek
  4. Stržení

Abychom to shrnuli, vše, co musíte udělat, je vytvořit „fiktivní“ databázový přípravek a nechat váš kód interagovat s těmito známými daty namísto skutečné databáze, kterou byste použili v produkci. Tato metoda vám umožňuje úspěšně izolovat testovaný kód, protože pracuje se známými daty, a to znamená, že můžete vytvářet konkrétní/testovatelná tvrzení o výsledcích vašich databázových operací.

AKTUALIZACE

Už jen proto, že je to mimořádně užitečný průvodce tím, co ne udělat ve svém kódu, pokud chcete podpořit testovatelnost, přidávám odkaz na Jak napsat 3v1L, netestovatelný kód . Netýká se to konkrétně testování databáze, ale přesto je to užitečné. Šťastné testování!

AKTUALIZACE 2

Chtěl jsem reagovat na komentář o odložení testování modelu, protože stávající kódová základna neimplementuje PDO pro přístup k databázi:

Vaše modely nemusí k implementaci rozšíření DbUnit PHPUnit používat PDO.

Pokud používáte CHOP, trochu vám to usnadní život, ale nemusíte to dělat. Řekněme například, že jste svou aplikaci vytvořili pomocí vestavěného PHP pg_* PostgreSQL funkce. PHPUnit vám stále umožňuje specifikovat zařízení a stále je může pro každý test znovu sestavit – při provádění testů byste jednoduše museli nasměrovat své připojení na stejný zdroj, jaký používá rozšíření DbUnit pro své zařízení.




  1. ORA-00936:chybějící výraz orákulum

  2. nedefinovaná chyba indexu z php arrya

  3. MySQL datetime výchozí čas s intervalem

  4. Java, MySQL:Existuje způsob, jak vložit server MySQL s programem Java?