~ Jarosław StadnickiBogowie Słuchając wystąpień wujka Boba czy innych wielkich mówiących o czystym kodzie, solidzie, testach, architekturze, devopsach i innych słowach kluczowych można popaść w depresję: „O żesz, mój kod nigdy taki nie będzie, lepiej nikomu go nie pokaże, sam zamknę się w piwnicy i do końca życia będę żywic się ziemniakami i robakami które będą do mnie przypełzać”. Czy naprawdę tak jest? Czy kod który piszemy musi być jak kryształ?Obrazek Słuchając różnych podcastów, usłyszałem taka ...
Sztuka programowania 3160 dni, 2 godziny, 30 minut temu 192 źrodło rozwiń
Chciałem pokazać działanie kilku ciekawych atrybutów w NUnit. Długo się zastawiałem które są najciekawsze, w jakiej formie je sprzedać, jakich przykładów użyć i na co zwrócić uwagę. Doszedłem do jednego wniosku: za długo się zastanawiam. Poniżej pierwszy atrybut, który często mi się przydaje, a może nie każdy jest świadom jego istnienia.
TSQLT – IZOLACJA TABEL Jedną z największych korzyści z tSQLt jest moim zdaniem izolacja danych. Załóżmy, że mamy na następującą tabelę...
Bazy danych i XML 3170 dni, 13 godzin, 8 minut temu 98 źrodło rozwiń
JMeter jest darmową aplikacją bardzo przydatną podczas wykonywania “load testing”. Interfejs użytkownika co prawda jest bardzo mało intuicyjny, ale po pewnym czasie można przyzwyczaić się. Aplikacja, po uruchomieniu prezentuje się następująco (...) Oczywiście na oficjalnej stronie można znaleźć pełną dokumentację, więc moim celem nie jest opisywanie każdego elementu. Jako próbkę, po prostu spróbujmy stworzyć test, który będzie łączył się z jakąś stroną (np. Google) i...
Atrybut InternalsVisibleTo służy do definiowania zaprzyjaźnionych bibliotek. “Zaprzyjaźniona” biblioteka to taka, która ma dostęp do klas i metod z modyfikatorem “internal”. Zwykle korzysta się z niego w celu przetestowania wewnętrznych klas. Czasami bywa, że klasy w bibliotece mają modyfikator internal i co za tym idzie, nie ma do nich bezpośrednio dostępu z testów. Za pomocą InternalsVisibleTo można zrobić wyjątek dla jakieś biblioteki, w tym przypadku projektu z testami.
Testy jednostkowe z natury muszą być wykonywane w izolacji. Wykonanie np. pierwszego testu nie powinno mieć żadnego znaczenia dla pozostałych. Analogicznie, kolejność ich wykonywania nie ma znaczenia. Zwykle jest to bardzo proste i osiąga się to poprzez np. mock’i. Czasami jednak może zajść potrzeba całkowitej izolacji poprzez wykonywanie każdego testu w osobnej AppDomain. Myślę, że w 99% przypadków jednak, można bez tego obyć się. Ostatnio jednak, pisząc pewne narzędzie do Visual Studio, musiałem odiz...
Sztuka programowania 3376 dni, 2 godziny, 31 minut temu 155 źrodło rozwiń
Nie jest to pierwszy wpis o SpecFlow i podstawy framework’a znajdziecie oczywiście w archiwum. W SpecFlow można definiować tzw. “Scenario outline”, które służą jako szablony dla testów. Oczywiście data-driven testing nie powinno być nadużywane i w szczególności dla acceptance tests nie ma to wielkiego sensu. SpecFlow jest często używany dla testów systemowych i UI, gdzie nie testujemy wszystkich możliwych kombinacji danych wejściowych. Czasami jednak chcemy mieć bardziej sparametryzowany zestaw testów...
Sztuka programowania 3433 dni, 16 godzin, 38 minut temu 126 źrodło rozwiń
Szczególnie w przypadku WebAPI, routing może być dość skomplikowany. W Nancy bardzo łatwo przetestować mapowanie między URL a zaimplementowaną logiką. W WebAPI moim zdaniem jest to dużo mniej wygodnie, ale wciąż powinniśmy zadbać o to, aby mieć zautomatyzowane testy dla routing’u. Załóżmy, że mamy kontroler z niestandardowym routingiem...
Każdy z nas jest choć trochę leniwy. Jedni troszkę mniej, inni troszkę bardziej. Ja na ten przykład czasem się rozpędzam i piszę kod, który potrzebuje. Potem o nim opowiadam, a potem ktoś pyta czemu nie skorzystałem z jakiejś tam gotowej biblioteki. Wiem, że każdy z nas należy do mensy i wie, że ten wpis nie wziął się z powietrza.
Definicja testów jednostkowych nie jest jednoznaczna i moim zdaniem zmieniała się przez lata. Jednostkę (“unit”) można w różny sposób interpretować. Wiele programistów uważa, że należy testować wyłącznie poszczególne klasy. Dobrą stroną takiego podejścia jest fakt, że jak test zakończy się niepowodzeniem, wtedy od razu wiadomo gdzie szukać przyczyny. Przy dobrym zestawie testów, debugger przestaje być potrzebny. Osobiście preferuje zupełnie inne podejście. W aplikacjach biznesowych, moim zdaniem aż t...
Sztuka programowania 3545 dni, 14 godzin, 42 minuty temu 263 źrodło rozwiń
Dzisiaj chciałbym przedstawić framework WatiN, który służy do automatyzacji testów. Symuluje on po prostu przeglądarkę internetową (dosłownie). Za pomocą niego, możemy otworzyć IE, wejść na daną stronę czy kliknąć w jakiś przycisk. Wszystkie operacje takie jak kliknięcie w link czy nawet maksymalizacja okna są możliwe dzięki WatiN. Docelowo używa go się w połączeniu z nUnit albo SpecFlow. Zacznijmy jednak od zwyklej aplikacji konsolowej. Załóżmy, że chcemy wejść na Google.pl, wpisać tekst i kliknąć w pr...
Sometimes when you write tests you want to check how the code behaves in different cases. I had already experienced that a couple of times before and I always used TestCase annotation available in nUnit library. It’s nice to know that nUnit offers an alternative approach as well...
Jednym zdaniem NCrunch to narzędzie do automatycznego uruchamiania testów jednostkowych w Visual Studio. Pisałem już o NCrunch-u ale o tak świetnym dodatku warto napisać jeszcze raz i to z dwóch powodów. Po ostatniej prezentacji na ITAD na bielskiej ATH kilka osób pytało mnie o zielony pasek więc w ramach wyjaśnienia taki zielony pasek to wła...
Do napisania niniejszego wpisu zainspirowała mnie pewna dyskusja, którą prowadziłem z kolegą po fachu. Dyskusje wywołało niefortunnie(wg. mojego kolegi) użyte przez ze mnie słowo mock zamiast stub. Za nim przejdę do opisywania dyskusji szybko trochę teorii i nomenklatury. W tym wpisie celowo pomijam techniki takie jak TDD czy BDD i pewnie tracę przez to wielu czytelników;). Pragnę skupić się na tym czym jest i był...
Sztuka programowania 4063 dni, 10 godzin, 33 minuty temu 456 źrodło rozwiń
Pewnie każdy na swojej ścieżce programistycznej spotkał się z klasą abstrakcyjną. Wrzucamy tam kod, który zdaje się być domyślną implementacją pewnej grupy klas i szkoda nam kopiować tego zachowania do każdej z nich osobna. Skoro wszystkie zachowują się podobny sposób, czasem tylko dodając coś od siebie, to warto wykorzystać dziedziczenie i napisać mniej (DRY).
Sztuka programowania 4183 dni, 17 godzin, 54 minuty temu 227 źrodło rozwiń
Pisząc testy jednostkowe dość często spodziewamy się identycznego zachowania w różnych testowanych scenariuszach. “Gdy zajdzie X, ma wydarzyć się A, B i C”. Z kolei “gdy zajdzie Y, ma wydarzyć się A, B i D”. W takich przypadkach, wykorzystując standardowe biblioteki do unit testów, mamy do wyboru kilka rozwiązań: wspólna klasa bazowa współdzielone metody “asercji” w ramach jednej klasy copy/paste testów pomiędzy klasami … pewnie jeszcze coś i...
Sztuka programowania 4187 dni, 15 godzin, 32 minuty temu 102 źrodło rozwiń
Opublikowano We wpisie o pokryciu kodu (Code Coverage) napisałem: Należy pamiętać, że to są narzędzia dla programisty Co przez to rozumiem? Code Coverage nie może być używany przez kierownictwo/zarząd/management/etc – a już pod żadnym pozorem nie może być związany finansowo z wypłatą programisty. Dlaczego? Przyciśnięty programista może bardzo łatwo wygenerować dowolne pokrycie kodu i to przy dosyć małej ilości pracy. Pisząc odpowiednią ilość testów jednostkowych bez asercji można uzyskać 100% pokryci...
I’m a big fan of using conventions when developing applications. I blogged about it in the past (here, here and later here). I also gave a talk about my experience with this approach and how I currently use it at NDC last week (slides are available here, video is here). One problem I faced when trying to build convention validation tests was lack of simple API that would allow me to build the validation rules for my tests. I built a spike of such library (call...
Sztuka programowania 4512 dni, 18 godzin, 53 minuty temu 80 źrodło rozwiń
To jest mój pierwszy post, ale od czegoś trzeba zacząć. Wybacz więc niedociągnięcia :). Na pierwszy temat rzucam porównanie wydajności kilku bibliotek (framework'ów) do wstrzykiwania zależności (Dependency Injection), które jest częścią paradygmatu odwróconego sterowania (Inversion of Control) - więcej można przeczytać tutaj. Ostatnio przeczytałem, że znaczna większość programistów korzysta z tych dobrodziejstw. Niby dobrze, o ile wiemy z czym mamy do czynienia. Część bibliotek jest przeładowana ...
Architektura 4554 dni, 6 godzin, 24 minuty temu 387 źrodło rozwiń
Odpowiedź na pytanie postawione w tytule pytanie to temat nie na posta, ale na całą (może nawet niejedną) książkę. Poniżej postaram się nakreślić najważniejsze według mnie aspekty tworzenia testów... chociaż na pewno lista ta nie jest kompletna. Aha, no i nie jestem w stanie podać niezawodnej recepty na "dobry test". Zgłębiam temat od dobrych kilku lat i sam ciągle się uczę, więc cudów nie ma - praktyka i identyfikowanie własnych pomyłek jest najlepszym nauczycielem:).