Ankündigung

Einklappen
Keine Ankündigung bisher.

Upgrade auf PHPUnit 10

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Upgrade auf PHPUnit 10

    Hallo!

    Seit diesem Februar ist PHPUnit 10 erschienen und ich habe bisher die Version 9 benutzt. Es gab Änderungen und ich musste meine phpunit.xml auf die neue Version migrieren, was mit einer Option --migrate-configuration auch gelang. Die alte Konfiguration wurde nach phpunit.xml.bak verfrachtet und sieht so aus:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
             bootstrap="vendor/autoload.php"
             cacheResultFile="var/caches/phpunit/"
             executionOrder="depends,defects"
             forceCoversAnnotation="true"
             beStrictAboutCoversAnnotation="true"
             beStrictAboutOutputDuringTests="true"
             beStrictAboutTodoAnnotatedTests="true"
             convertDeprecationsToExceptions="true"
             failOnRisky="true"
             failOnWarning="true"
             verbose="true"
             colors="true"
             testdox="true">
        <testsuites>
            <testsuite name="default">
                <directory>tests</directory>
            </testsuite>
        </testsuites>
        <coverage cacheDirectory="var/caches/phpunit/code-coverage"
                  processUncoveredFiles="true">
            <include>
                <directory suffix=".php">src</directory>
            </include>
        </coverage>
    </phpunit>
    das neue so:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.0/phpunit.xsd"
             bootstrap="vendor/autoload.php"
             executionOrder="depends,defects"
             beStrictAboutOutputDuringTests="true"
             failOnRisky="true"
             failOnWarning="true"
             colors="true"
             testdox="true"
             cacheDirectory=".phpunit.cache"
             requireCoverageMetadata="true"
             beStrictAboutCoverageMetadata="true">
      <testsuites>
        <testsuite name="default">
          <directory>tests</directory>
        </testsuite>
      </testsuites>
      <coverage>
        <include>
          <directory suffix=".php">src</directory>
        </include>
        <exclude>
          <directory>bin</directory>
          <directory>docs</directory>
          <directory>public</directory>
          <directory>resources</directory>
          <directory>templates</directory>
          <directory>var</directory>
          <directory>vendor</directory>
      </exclude>
      </coverage>
    </phpunit>
    Soweit so gut und es funktioniert erstmal auch soweit. Wenn ich jetzt aber phpunit nutze, phpunit --configuration phpunit.xml, bekomme ich nun eine kurze Liste mit Ausgaben. So steht bei mir:

    Code:
    ERRORS!
    Tests: 97, Assertions: 52, Errors: 46.
    Die vielen Fehler kommen daher, weil ich vor kurzem ein "großes" Refactoring der Applikation gemacht habe. In der Version 9 hatte ich auch eine Vollständige Liste mit allen Problemen. Und nun sehr kurz und ich kann die Probleme nicht nachlesen. Was muss ich Einstellen damit ich wieder eine Vollständige Liste aller Probleme angezeigt bekomme?

    Vielen Dank für die Hilfe.

    mfg

  • #2
    Ich konnte das Problem selbst lösen. Durch das Refactoring haben sich Namespaces, die Art wie die Klassen initialisiert werden, geändert. Statt:

    PHP-Code:
    namespace App\Domain\Event;

    final class 
    Event
    {
        private ?
    int $id null;
        private ?
    string $title null

        
    public function getId() {}
        public function 
    setId(int|null $id) {} 
    zu

    PHP-Code:
    namespace App\Domain\Event;

    final class 
    Event
    {
       public function 
    __construct(
            private ?
    int $id null,
            private ?
    string $title null,

        ) {}

    Ich muss also $event = new Event(1, 'Konzert) eintragen, statt wie früher $event->setTitle('Konzert')

    Der alte Test sieht so aus:

    PHP-Code:
    namespace Tests\Domain\Event;
    use 
    App\Domain\Event\Event;
    use 
    PHPUnit\Framework\TestCase;

    class 
    EventTest extends TestCase
    {
        private 
    Event $event;
        public function 
    setUp(): void
        
    {
            
    $this->event = new Event;
        } 
    Genau das schien das Problem zu sein. PHPUnit hat zwar Fehler festestellt, konnte aber nicht anzeigen Was und Wo. Also habe ich es entfern, nachdem ich anfing die Dateinen einzeln mit PHPUnit zu analysieren.

    PHP-Code:
    namespace Tests\Domain\Event;
    use 
    App\Domain\Event\Event;
    use 
    PHPUnit\Framework\TestCase;

    class 
    EventTest extends TestCase
    {

        public function 
    setUp(): void
        
    {

        } 
    Prompt werden die Fehler für diese Klasse angezeigt. Der eigentliche Fehler war also, das der Herr Entwickler (Ich ) beim Refactoren die Tests nicht gleich mit gezogen hat.

    Schönes Wochenende

    Kommentar


    • #3
      Deine Erklärung macht nicht wirklich sinn. Auch die bisherige Version ist valider Code.

      Kommentar


      • #4
        Sry, jetzt erst eingeloggt und gesehen das mir jemand geschrieben hat. Alles ist valider Code, nur bisher konnte ich nicht rausfinden warum mir bei der einen Schreibweise Infos vorenthalten werden und bei anderem nicht.


        PHP-Code:
        namespace Tests\Domain\Event;
        use 
        App\Domain\Event\Event;
        use 
        PHPUnit\Framework\TestCase;

        class 
        EventTest extends TestCase
        {
            private 
        Event $event;
            public function 
        setUp(): void
            
        {
                
        $this->event = new Event;
            } 
        Wenn hier alle, also mit diesem Kopf, Tests fehlerfrei sind, sehe ich nur die Meldung das alles okay ist. Doof wird es nur wenn Tests nicht durch gehen, dann sehe ich das Test nicht durch geht, aber nicht was genau und wo.

        PHP-Code:
        class BankAccountTest extends TestCase
        {
            public function 
        setUp(): void
            
        {
                
        // do something ...
            
        }

            
        /**
             * @covers App\Domain\Settings\BankAccount
             */
            
        public function testBankAccountInstance(): void
            
        {
                
        $bankAccount = new BankAccount;

                
        $this->assertInstanceOf(BankAccount::class, $bankAccount);
            } 
        Wenn ich aber nun die setUp()-Methode nicht nutze und so meinen Test schreibe, wird mir alles ganz normal angezeigt. Was wurde getestet und wenn es fehlgeschlagen hat, was genau und wo.

        PHP-Code:
        final class BankAccount
        {
            public function 
        __construct(
                private ?
        string $recipient null,
            )
            {
                
        $this->setRecipient($recipient);
            } 
        So sieht die getestete Klasse in der Grundform dann aus. Vielleicht wird es jetzt etwas klarer.

        Kommentar

        Lädt...
        X