W końcu dobrze napisane testy z odpowiednią strukturą ładowania Composer

Potykałem się, czołgałem po ziemi, mając źle skonfigurowany projekt, nad którym powinienem był pracować. I wtedy zrozumiałem, jak powinienem uporządkować sposób ładowania klas.

Oto, co miałem wcześniej w moim projekcie:

{
  "autoload": {
    "psr-4": {
      "Ziumper\\App\\": "src/",
      "Ziumper\\App\\": "tests/"
    }
  }
}

Ale w ten sposób wszystkie moje klasy były ładowane do mapy autoload Composera. Wiedziałem, że musi być na to lepszy sposób. I oto co odkryłem:

{
  "autoload": {
    "psr-4": {
      "Ziumper\\App\\": "src/"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "Ziumper\\App\\": "tests/"
    }
  }
}

W międzyczasie napotkałem kilka poważnych problemów — nie mogłem zadeklarować Traitów w folderze testów, a kopiowanie i wklejanie całego tego kodu było bardzo frustrujące. W końcu przeszedłem do kolejnej wersji. Nie była ona idealna, ale działa dla podstawowych aplikacji. Musiałem wziąć poprawkę na to, że np w Shopware autloading się różni i musiałem napisać własny loading bootstraperem.

{
  "autoload": {
    "psr-4": {
      "Ziumper\\App\\": "src"
    },
    "exclude-from-classmap": ["tests"]
  },
  "autoload-dev": {
    "psr-4": {
      "Ziumper\\App\\Tests\\Utils\\": "tests/utils",
      "Ziumper\\App\\Tests\\Unit\\": "tests/unit",
      "Ziumper\\App\\Tests\\Integration\\": "tests/integration"
    }
  }
}

Jak to działa:

  • wszystkie deklaracje przechowywane są w folderze src, a te używane w testach — np. bazowe przypadki testowe, trait’y, data providery itd. w folderze tests utils,
  • testy integracyjne i jednostkowe korzystają z odniesień do tests i wszystko działa bardzo sprawnie,
  • exclude-from-classmap to coś w rodzaju strażnika, który pilnuje, aby kod testowy nie został przypadkowo załadowany do produkcyjnego środowiska.
  • PSR-4 autoloader Composera ładuje klasy w locie po namespace → folder → filename.
  • PHPUnit korzysta z autoloadera, więc klasy są widoczne w testach.
  • exclude-from-classmap = chroni produkcję przed ładowaniem klas testowych, nie blokuje testów
  • nie ma potrzeby pisania wielu skryptów do ładowania klas php

Proces ładowania klas, może się różnić w zależności od użytego frameworka czy zasad. Np. w shopware pluginy nie chcą ładować klas Utils co naprawić dodając własny bootstraper.




Enjoy Reading This Article?

Podoba Ci się ten artykuł?

Oto kilka następnych artykułów, które mogą Ci się również spodobać:

  • Nowy tool n8n!
  • Alternatywne IDE dla PHP? Apache Netbeans, ale nie tylko!
  • Przecinek po nowej linii w argumentach funkcji PHP (trailing comma)
  • Wykorzystanie array_map() w codziennym życiu programisty. Przegląd PHP #7
  • Jak zintegrować GitHub Copilot do automatycznego generowania wiadomości commitów?