Wpis z mikrobloga

tak sobie siedze i kodze i testy pisze i w losowym momencie jeden test (nie nadążałem z załapaniem który) się wywalał. testy mam zawsze uruchomione komendą wait co 2 sekundy, dzieki temu kodze i od razu widze, czy coś się wyłożyło. mam kod kalendarza, troche operacji na czasie i datach, więc pewność niemal mam, że czasem coś gdzieś może się niedopatrzyło, sekundy sie nie sumujo, czy co. raz nawet zdarzyła mi się sytuacja, że ze względu na jakieś tam strefy czasowe czy coś innego, testy się wywalały, ale bodajże jakoś tylko w pierwszej ćwiartce dnia (po polnocy) - no nie ważne. Ale znalazłem prosty sposób jak przetestować nieco lepiej, czy testy testują ok, a także - w wypadku operacji na datach - można wyłapać sytuacje, kiedy coś się wywala.

po prostu zapuszczamy sobie testy z wait, ale z opcjami dodatkowymi - zatrzyma się test gdy pojawi się błąd i można łatwiej dość co gdzie i dlaczego. może to sobie działać w tle nawet godzinami, oczywiście zależnie od tego jaki typ testów mamy i jak długo zajmują, w moim przypadku niewiele ich i lecą 250ms.

watch -b -e -n 1 ./bin/phpunit
#php #programowanie

troche sie rozpisalem o pierdółce, w sumie mam kaca i tak tylko się chwale
  • 10
  • Odpowiedz
przy okazji, nie wiedzialem, ze na phpunitowym assertEquals() można ustawiać 'delte', czyli dopuszczalny błąd ;)

$this->assertEquals($command->endDate, new DateTime("+2 hour"), 1);
w tym wypadku 1 sekunda nikogo nie zabije ;)
  • Odpowiedz
@uirapuru: Nie macie tam w unit test toolsach do PHPa jakichś raportów z wykonanych testów, co kiedy i gdzie się wywaliło? Według mnie coś nie tak jest z twoimi testami. Jeżeli testujesz metody, które zależą od zewnętrznych komponentów to powinieneś je zastąpić atrapami. Lepiej mieć więcej testów, które testują mniejsze fragmenty kodu, bo łatwiej jest potem zlokalizować błędy.
  • Odpowiedz
@uirapuru: Więc możliwe, że masz błąd w kodzie a z całą pewnością źle podchodzisz do testów. Jeżeli twoja testowana metoda dajmy na to pobiera czas z systemu albo dostaję datę z jakiegoś zewnętrznego API i wykonuje na niej różne operacje w konsekwencji czego zwraca jakiś wynik, to jak napisać do tego asercję? W takich sytuacjach tworzysz atrapę (mocka) takiego komponentu i w momencie kiedy nastąpi jego wywołanie zwracasz taką wartość jakiej
  • Odpowiedz
@KurtRussell: tak, w jakiejś skali to źle zaprojektowany kod, bo mam w metodzie

->setDeletedAt(new DateTime);

oczywiście nie powinien być tak obiekt wstawiany, tylko wyciągany ze wstrzykniętej fabryki do dat... którą bym sobie mockował... Mam nadzieje, że obaj rozumiemy już jak absurdalny to byłby pomysł w tym wypadku :D

Anyway, dziś właśnie z takiego powodu miałem rozstrzał, bo robiłem asercję equals miedzy tak zainicjowanym obiektem, a stworzony drugim. Zazwyczaj powinno dzialac, ale
  • Odpowiedz