Forum Centralne

Wspólne forum Księstwa Sarmacji i jego prowincji

Przejdź do zawartości

W przypadku problemów z zalogowaniem usuń ciasteczka.

[Projekt] Automatyczna weryfikacja kodu DSG

[Projekt] Automatyczna weryfikacja kodu DSG

Postprzez Prokrustes 16 gru 2020, o 23:23

Stan wyjściowy: Kod DSG jest testowany wyłącznie na produkcji. Brak jest mechanizmów jakiejkolwiek automatycznej weryfikacji.

Cel: Celem projektu jest stworzenie procesu który częściowo pełni rolę tak zwanego Continuous Integration. W zamyśle każdy commit wykonany do repozytorium projektu DSG powinien zostać zweryfikowany przez testy jednostkowe a także przez wybrane narzędzie do analizy statycznej. NIA powinna otrzymać informację zwrotną o wyniku każdej weryfikacji.

Realizacja:

Krok "1" - wprowadzenie testów jednostkowych

Zaczynamy od znalezienia odpowiedniej biblioteki. Jeden szybki google i znajdujemy https://phpunit.de/.
Bibliotekę, jak to zwykle w nowoczesnym świecie PHP, instalujemy narzędziem composer.

Kod: Zaznacz cały
composer global require "phpunit/phpunit=9.*"


Trzeba zwrócić uwagę, że idąc po bandzie zainstalowaliśmy phpunit globalnie. W skromnym środowisku deweloperskim nie spodziewam się jednak problemu z tego tytułu (jakiś konfliktów wersji).

Mając phpunit zainstalowane (i dostępne w zmiennej PATH najpewniej wraz z całą dystrybucją php) podejmujemy trud by bibliotekę tę wykorzystać.

W głównym katalogu projektu umieszczamy plik phpunit.xml

Kod: Zaznacz cały
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
        backupGlobals="false"
        backupStaticAttributes="false"
        bootstrap="_application/autoload.php"
        colors="true"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
        convertWarningsToExceptions="true"
        processIsolation="false"
        stopOnFailure="false"
        syntaxCheck="false"
        >
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
</phpunit>


Idąc po bandzie ustawiam tylko dwie swoje wartości. Po pierwsze "bootstrap" - a więc plik php który z użyciem funkcjonalności _autoload umożliwi testom znalezienie wszystkich klas naszego projektu bez żmudnego ich includowania przy każdym teście.

Po drugie "directory" a więc katalog gdzie nasze testy będą fizycznie zlokalizowane.

Wreszcie przychodzi pora na stworzenie pierwszego testu w PHP. I siup...
Na warsztat bierzemy prostą funkcję czyMiasto która na podstawie ID zwraca informację czy ... to jest ID miasta.
Wrzucamy trzy testy - dla identyfikatora miasta, dla identyfikatora innego niż miejski i wreszcie dla wartości "null" którą niestety często spotykamy dziko hasającą po naszych kodach.

Kod: Zaznacz cały
<?php

declare(strict_types=1);
use PHPUnit\Framework\TestCase;

final class LibraryPomocniczeTest extends TestCase
{
    public function testCzyMiastoTrue()
    {
        $this->assertEquals(Library_Pomocnicze::czyMiasto('M0001'), true);
    }
    public function testCzyMiastoFalse()
    {
        $this->assertEquals(Library_Pomocnicze::czyMiasto('P0001'), false);
    }
    public function testCzyMiastoNull()
    {
        $this->assertEquals(Library_Pomocnicze::czyMiasto(null), false);
    }

}

?>


Kod zapisujemy jako LibraryPomocniczeTest.php w katalogu tests i wreszcie możemy uruchomić nasze testy wykonując po prostu komendę "phpunit" w głównym katalogu projektu.

Otrzymujemy prosty wynik:

.. 3 / 3 (100%)

Time: 00:00.019, Memory: 6.00 MB

OK (3 tests, 3 assertions)


Możemy też wywołać testy wskazując bardziej zaawansowany format wyników, jak na przykład plik xml zgodny z formatem junit.

Kod: Zaznacz cały
phpunit --log-junit result.xml


W kolejnym poście przejdziemy do faktycznego uruchamiania testów po każdym commicie bez interwencji biednego radcy NIA.
Prokrustes
Diuk Athos
Markiz Awary Sarmackiej
Posłaniec Starych Bogów
... bo śmierć to nie koniec ...
Avatar użytkownika
Naczelna Izba Architektury
Starosarmacja
 

Re: [Projekt] Automatyczna weryfikacja kodu DSG

Postprzez Prokrustes 20 gru 2020, o 23:45

Kolejnym krokiem naszego małego projektu jest faktyczne zautomatyzowanie uruchamiania się testów po każdym commicie.

Na rynku istnieje szereg narzędzi które można określić jako "Serwer CI" albo "Serwer automatyzacji". W pracy korzystam (wraz z firmą) z Jenkinsa (https://www.jenkins.io/) tym razem jednak skupiłem się na tym by znaleźć coś co mogłoby działać za darmo w ramach serwisu utrzymywanego przez dostawcę oprogramowania.

Okazało się, że jedna z alternatyw dla Jenkinsa - TeamCity (https://www.jetbrains.com/teamcity/) - ma w fazie beta (testowej) serwis z którego można za darmo korzystać. Oczywiście przyjdzie najpewniej dzień, że darmowy serwis zacznie być płatny dlatego też w dalszych działaniach staram się nie przywiązywać zanadto do funkcjonalności tej konkretnej platformy.

Sam CI Serwer daje głównie możliwość uruchamiania zadań w oparciu o harmonogram lub jakieś zdarzenia (jak np. commit). Jednak trzeba te zadania gdzieś uruchamiać. Żeby się nie przywiązywać do TeamCity skorzystałem z możliwości podpięcia swojego serwera VPS jako noda/agenta

https://www.jetbrains.com/help/teamcity/2020.1/setting-up-and-running-additional-build-agents.html#Installing+via+ZIP+File

Po skonfigurowaniu agenta oraz tego, żeby TeamCity mogło sprawdzać na bieżąco czy są nowe commity w repozytorium DSG pozostało jeszcze skonfigurować logikę zadania weryfikującego stan kodu. W tym przypadku (na razie) jest to proste phpunit - by odpalić testy jednostkowe.

Tak uzyskaliśmy oczekiwany efekt tego etapu. Po każdym commicie uruchamiają się testy. Można też łatwo wklikać się jakie dokładnie zmiany weszły w stosunku do poprzednich testów (ale takich tajemnych rzeczy już nie pokazuję).


tc-2.jpg


tc-1.jpg
Prokrustes
Diuk Athos
Markiz Awary Sarmackiej
Posłaniec Starych Bogów
... bo śmierć to nie koniec ...
Nikt jeszcze nie polubił tej wypowiedzi
Avatar użytkownika
Naczelna Izba Architektury
Starosarmacja
 


Powrót do Technikum im. Innowacji

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość

cron