Witam wykopki!
Czy testowaliście kiedyś bazę danych w testach jednostkowych/scenariuszach?
Chodzi o testowanie zapisywanych wartości w bazie po wykonaniu konkretnych operacji.
Na przykład koniec rundy - gracz powinien otrzymać hajs i musimy to sprawdzić.
Czy znacie jakieś narzędzie do tego?

PHPUnit
@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
  • Odpowiedz
@GeDox: Jeżeli chcesz sprawdzać bazę to musisz pisać zapytania ręcznie. Jeżeli nie chcesz pisać zapytań ręcznie to rozwiązanie podrzucił @Hepar. Mockowanie funkcji zapisu do bazy i sprawdzanie przed zapisaniem czy przyszło wszystko ok.
  • Odpowiedz
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?
  • Odpowiedz
@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
  • Odpowiedz
@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
  • Odpowiedz
@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
  • Odpowiedz
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
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.
@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
  • Odpowiedz
@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.
  • Odpowiedz
@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.
  • Odpowiedz
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 #
@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?
  • Odpowiedz
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.
  • Odpowiedz
Hej mirki spod tagu #programowanie
Jestem ciekaw jak wielu z was używa TDD (tego prawdziwego TDD, nie samych unit testów).
Zacząłem naukę phpunit, miałem zamiar wkręcać się w TDD, ale im więcej o tym czytam tym więcej wątpliwości...Np tu
Jak to jest z tym unit testing u was? Używacie? Jeśli tak to w jakim zakresie?
#php #phpunit #tdd
@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 wartość oczekiwaną z 42 na 43.

Teraz, nie uważam bynajmniej, że TDD jest łatwe. Nie jest łatwo pisać dobre testy. Łatwo pisać syfne testy. To tak jak z kodem.

Dobre testy wydają się bardzo nieszczególne gdy się je czyta. Ale trudno jest dobrać odpowiedni poziom DRY, odpowiedni poziom przejrzystości kodu i "wyglądania jak przykładowe użycia" (to kłóci się często z DRY), odpowiedni poziom mockowania (nie mockować za dużo) itp. itd. Zresztą, ludzie popełniają dużo prostsze błędy przy
  • Odpowiedz
@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, czyli tworzysz sobie pusty TestCase / blok it() (w BDD), czy cokolwiek innego. Nadajesz mu nazwę która opisuje funkcjonalność, którą będzie testował. Zauważ, że ten test nie musi sprawdzać wszystkiego, co robi jakaś jedna metoda. Może sprawdzić tylko kilka rzeczy. Jeśli piszesz kalkulator, to jednym testem będzie "dzieliDwieLiczby", a osobnym "wyrzucaWyjątekDzieleniaPrzezZero", mimo że to ta sama
  • Odpowiedz
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
@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.
  • Odpowiedz
@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ć.
  • Odpowiedz
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
Gdzie widzisz problem? Do zmiennej przypisujesz wartosci, nastepnie odpalasz sobie taki setter i sprawdzasz jakis assert, exception czy cokolwiek chcesz.
  • Odpowiedz
@ghost1511: Jak nie masz gettera to testuj metody, które używają właściwości (settera testujesz pośrednio). Generalnie taki setter z walidacją/parsowaniem to side effect i powinno się tego unikać.
  • Odpowiedz