@GeDox: W takim wypadku mockujesz funkcję zapisu do bazy danych i nie wykonujesz zapytania tylko sprawdzasz czy poprawny typ danych przyszedł i odpowiednie operacje się wykonały
Tym razem poruszyłem temat testowania przy użyciu PHPUnit i Dockera.


@robdevblog: ja bym powiedział, że poruszyłeś temat tworzenia skryptu sh i aliasów ¯\_(ツ)_/¯

btw. czemu skrypt służący do odpalania testów nazwałeś "app.sh" a nie np. "test.sh" albo "run-tests.sh" co by sam za siebie mówił do czego służy?
@bmLq: dziękuję za feedback!

Niestety nie mogę się tutaj zgodzić. Tematem postu jest to jak ułatwić sobie pracę z testami. Skrypt to tylko narzędzie użyte do osiągnięcia mojego celu. Patrząc w ten sposób można powiedzieć, że poruszyłem jeszcze pięć innych tematów.

Jeśli ktoś napisze post o skonfigurowaniu zdalnego dostępu do serwera w PHPStorm to powiedziałbyś, że jest to artykuł o protokole SSH?

Nie objaśniam czym są skrypty Bash i wcale ich
@tylko_na_dole: nie, zapomnij o istnieniu kontenera w 90% przypadków przy pisaniu unitów. Używaj metody setUp aby jednorazowo tworzyć testowaną klasę i mocki bez kopiowania kodu. Trzymaj się standardu nazewnictwa: testFirst_Success() - mieszane dwa style. Dbaj o to żeby test miał nazwę adekwatną do tego co testuje - ten przykład jest dosyć abstrakcyjny, ale już tutaj dopisek Success gryzie; przykładowo gdybyś miał klasę która jedyne co robi to dodaje komentarz, to robisz
@tylko_na_dole: nie, w testach jednostkowych nie powinno być w ogóle kontenera i frameworka
do tego testowanie repozytoriów w testach jednostkowych mija się z celem, bo głównie będziesz testował mocki, albo czy dobrze działają natywne elementy języka(typu typowanie, wywołania metod, ustawianie propertiesów itp)

takie rzeczy lepiej testować integracyjnie, czy to na realnej bazie, czy na jakimś sqlite albo inmemory jeśli trwa to za długo, ale tego drugiego bym unikał, jeśli trwa to
Mam pytanie odnośnie pisania testów w Symfony 4 phpunit. Mam problem z mockowianiem w serwisie (ang Service) innych prywatnych serwisów, np. Repozytoriów.

W Symfony 3 robiłem to tak: pisałem mocka repozytorium i podmieniałem go w kontenerze $container->set('repo', $mock); - podmieniałem prawdziwy serwis na mock'a. Wtedy w serwis używał mojego mocka zamiast prawdziwego repo.

W Symfony 4 serwisy są prywatne. W takim razie jak się to robi?

Znalazłem w dokumentacji że tworzy się
mirki z
#programowanie i #php #phpunit

chcę podnieść jakość dostarczanego przeze mnie kodu i postanowilem nauczyc sie pisac testy inyegracyjne do tej pory pisałem tylko funkcjonalne/jednostkowe.

Mam pewien problem, próbuje otestowac kod gadający restowo z innym mikroserwisem.

no i metodę uderzajaca do serwisu chcialbym zamockowac by zwracala mi odpowiednie responsy, by sprawdzic czy moj kod odpowiednio obsluguje to. nie bardzo mam pojecie jak to zrobic.

kawalek pseudokodu

public static function wyslijMeila{

helper::pobierzMeilaZKolejki()
@Hipodups: + static mocks - unit podstawi wtedy swoją klasę przez autoloader i mock statica zadziała, warunek zaznaczony w dokumentacji że nie możesz "użyć" tej klasy zanim postawisz mocka
@mariecziek: Szukaj raczej ogólnie o testach jednostkowych, a nie stricte pod PHP. Filozofia pisania testowalnego kodu niczym nie różni się w PHP i innych językach jak Java czy inny C#.

Generalnie nie chodzi o to, jak pisać testy, tylko jak pisać kod, żeby się dało testy napisać.

No i jeszcze pytanie, czy interesuje Cię tylko pisanie unit testów, czy może jeszcze do tego TDD.
@mariecziek: Podstawowa kwestia, jeśli chodzi o testowalność kodu, to Dependency Inversion (Inversion of Control) poprzez Dependency Injection + interfejsy.
W momencie, gdy zależności przekazujesz z zewnątrz, jesteś w stanie je łatwo zmockować w teście, lub podstawić inną implementację zależności z warstwy infrastruktury (np. implementacja "in-memory" jakiegoś storage'u), dzięki czemu nie jesteś uzależniony od bazy etc.

Z tego też wynika dlaczego Service Locator (wstrzykiwanie całego DIC zamiast poszczególnych zależności) to antypattern. W
Mireczki, --coverage-clover i inne coverage z PHPUnit wykonują się niesamowicie długo, 5h albo więcej, jeszcze nie udało się przeprowadzić tego do końca. O kiego grzyba chodzi? Przecież to nie ma najmniejszego sensu nawet jakby wykonywało się raz na tydzień w nocy. Ilość testów to około 3k - 5-10min bez coverage. (2gb memory-limit ustawione, domyśłny xdebug)

Jakieś pomysły? W innych językach programowania widziałem że takie coś się migusiem wykonuje.

#programowanie #php #phpunit
@Lethal_Jelly: jak dużo masz plików w projekcie? Spróbuj dodać addUncoveredFilesFromWhitelist="false" do tagu whitelist, wtedy będzie monitorował tylko pliki, które testujesz. Dodatkowo zobacz jak długo wykonują się na innym komputerze - może masz coś spieprzone w konfiguracji. Ogólnie coverage w phpunit wykonuje się dużo dłużej niż normalne testy, ale 5h to jakiś hardcore. Może masz włączone profilowanie?
Jeśli chodzi o obsługę biblioteki samej w sobie, to dokumentacja - tu nie ma dużo filozofii.
Jeśli chodzi o pisanie testów, to łatwiej będzie Ci znaleźć coś language agnostic lub po prostu w innym języku (Java/C#). Filozofia jest zawsze ta sama, a że PHPUnit ma podobne api jak wszystkie te xUnity, to nie będziesz miał problemów z przełożeniem tego na PHP.
@gajowy_marucha:
Używam i widzę znaczne benefity w porównaniu do Test-Last. Mimo że pracuję w mocnym, zagranicznym teamie, nie wszyscy u mnie piszą Test-First. I problemem jest nawet nie tyle pokrycie testami czy projekt kodu. Czasami testy pisane Test-Last same zawierają błędy, tj. zdarza się, że nic nie testują. Zrobiłem ostatnio z tego powodu małą gównoburzę i mocno zaleciłem przynajmniej upewnienie się, że test zawodzi gdy np. popsujemy kod produkcyjny lub zmienimy
@gajowy_marucha:
No to masz pierwszy przykład gigantycznego zonka, na który trafiłeś. To kompletnie nie tak, jak to zinterpretowałeś. Choć wklejony przez Ciebie cytat tego nie tłumaczy.

Owszem, zaczynasz od pisania testu. Ale testy i kod piszesz PO KAWAŁECZKU. To JEST takie test-as-you-go, z tym tylko zastrzeżeniem, że najpierw zaczynasz od napisania kawałka testu, a potem piszesz kawałek kodu, który go implementuje.

Opiszę cykl działania w TDD. Zaczynasz od wymyślenia przypadku testowego,
Uprzedzając wszystkie drwiny i przekomarzania - wiem, że Windows nie nadaje się do #webdev. Niestety póki, co muszę z tym żyć.
A teraz problem:
Odpalam testy jednostkowe w konsoli bash za pomocą:

php phpunit.phar --testsuite "IntegrationTests" -c "D:\xampp_php_5.5.19\htdocs\e-shop\tests\configuration.xml"
Jak widać podałem ścieżkę bezwzględną i wszystko śmiga. Natomiast wywołanie:
php phpunit.phar --testsuite "IntegrationTests" -c "configuration.xml" powoduje błąd:

Could not read "configuration.xml"

Dodam, że nie ma różnicy czy odpalam z kosoli systemowej czy
@ghost1511: w folderze projektu (D:\xamppphp5.5.19\htdocs\e-shop\tests ) utwórz plik cmd z komendą

php phpunit.phar --testsuite "IntegrationTests" -c "%~dp0configuration.xml" albo z linii komend uruchamiaj komendą php phpunit.phar --testsuite "IntegrationTests" -c "%CD%configuration.xml" wtedy zadziała na różnych ścieżkach i komputerach.
@MacDada: bo tak naprawdę nie to jest meritum testu. W tym wypadku testuję poprawność dodawania przedmiotów do koszyka. Zmienną (testowaną) w tym wypadku jest liczba produktów a nie sam produkt (interfejs produktu). Teraz myślę, że wystarczyłby mock ProductInterface aby to dobrze przetestować.
Mirki i mirabelki jakie widełki krzyknąć na rozmowie o pracę (branża: media) w takim niedużym mieście w Polsce gdzie wymagają:

podstawę #phpunit
podstawy automatyzacji testów, tworzenia przypadków i scenariuszy testowych
podstawę PHP, SQL, HTML

sam ukończyłem 3 własne nieduże projekty-startupy (nie będę linkowac do nich bo nie chcę z nimi powiązywać konta na wypoku) w czystym phpie z używaniem jquery, bez żadnych frameworków, przesiedziałem nad nimi dosyć sporo czasu (~2lata), ale i