Programowanie

NUnit — Assert.Multiple

NUnit w wersji 3.6 wprowadził dość ciekawą funkcję — Assert.Multiple. Dzięki niej, dostajemy informacje na temat wszystkich testów, które nie przeszły. Przyjrzyjmy się temu bliżej… Do tej pory, używając kilku asercji naraz, jedna niespełniona asercja powodowała, że dalszy kod nie jest wykonywany.

Czytaj dalej...

TDD — Technika, metoda, metodologia czy metodyka?

Test-Driven Development pojawia się w kontekstach: techniki, metody, metodologii i metodyki. Które z tych określeń poprawnie definiuje TDD?

Czytaj dalej...

Czym są Story Pointy?

Jeśli estymacja czasowa nie sprawdza się w naszym projekcie (co jest wielce prawdopodobne w przypadku oprogramowania), to możemy się posłużyć estymacją relatywną.

Czytaj dalej...

Estymacja czasowa/godzinowa (oraz Cynefin Framework i PERT)

Estymacja, czyli szacowanie projektu programistycznego to bardzo często bolączka każdego zespołu. Czego użyć do szacowania naszego projektu: estymat godzinowych, roboczodniowych, Story Pointów, koszulkowych. A może w ogóle nie korzystać z estymat (#NoEstimates)? Postaram się przedstawić sposoby oraz zalety i wady każdej z tych metod estymacji, zaczynając od tego postu i estymat czasowych.

Czytaj dalej...

Kurs TDD cz. 25 — Otwarte pytania

To już ostatnia część kursu TDD (przed podsumowaniem) na tym blogu. Tym razem, formuła artykułu jest odmienna. Zamiast przedstawiać dane zagadnienie, to ja pytam Ciebie, czytelniku, o TDD... Jeśli uczysz się TDD, to warto przed wygooglowaniem odpowiedzi zastanowić się nad każdym z tych punktów i postarać się odpowiedzieć na pytanie. W przypadku, kiedy twój zespół uczy się TDD, to polecam zrobić brainstorming i do każdego pytania zebrać odpowiedzi grupy. Prowadząc kilka szkoleń na ten temat, zauważyłem że taka formuła sprawdza się idealnie jeśli te pytania na zadamy na początku i jeszcze raz, na końcu kursu, porównując odpowiedzi.

Czytaj dalej...

Kurs TDD cz. 24 — Czy pisać testy jednostkowe do istniejącego kodu (legacy code)?

Najprawdopodobniej spotkałeś się z tym problemem: Kod zastany, napisany przez nas lub nie, na pewno nie perfekcyjny i ostatecznie bez testów jednostkowych (ang. legacy code). Co teraz? Wstrzymać dotychczasowe prace nad projektem i pisać testy jednostkowe? A może całkowicie zaniechać pisania testów, bo skoro nigdy nie było testów, to po co pisać je teraz? Do tej pory omawialiśmy TDD z perspektywy pisania nowego kodu. Jak wygląda sytuacja w przypadku istniejącego już kodu?

Czytaj dalej...

Kurs TDD cz. 23 — Czy to się opłaca?

Test-Driven Development ma niezaprzeczalnie bardzo pokaźną liczbę zalet, jednak jednym z problemów stojących na przeszkodzie we wdrożeniu i stosowaniu tej techniki jest fakt, że pisanie testów jednostkowych wymaga większego nakładu czasowego programisty. Nie licząc czasu na zmianę sposobu myślenia oraz naukę zespołu, pisanie testów jednostkowych może trwać nawet dwukrotnie dłużej niż w sposób

Czytaj dalej...

Kurs TDD cz. 22 — Pokrycie kodu testami (code coverage)

Przyjrzymy się bliżej tematowi pokrycia kodu testami (code coverage).

Czytaj dalej...

Kurs TDD cz. 21 — Rodzaje frameworków do tworzenia atrap

Rodzaje framerków do tworzenia atrap możemy podzielić na dwie kategorie: constrained (z ang. ograniczony) i unconstrained (nieograniczony)

Czytaj dalej...

Kurs TDD cz. 20 — Mockowanie DateTime.Now, random, static, itp.

Jedną z największych trudności dla osoby zaczynającej przygodę z testami jednostkowymi są metody i klasy statyczne oraz niederministyczne lub/i niepowtarzalne zależności. Testy jednostkowe muszą być deterministyczne i powtarzalne. Musimy przyjąć zatem strategię wstrzykiwania alternatywnej implementacji dla wywołań DateTime.Now, funkcji losującej, itp. W tym artykule przedstawię jedną ze strategii tworzenia atrap dla tego typu zależności.

Czytaj dalej...

Kurs TDD cz. 19 — Mock, stub, fake, spy, dummy

Nomenklatura w świecie TDD, a w szczególności ta dotycząca tworzenia atrap, jest źródłem wielu niejasności. Powodem takiego stanu jest fakt, że definicje różnią się w zależności od źródła, tj. książki, lub frameworka. W tym wpisie poznamy charakterystykę takich obiektów testowych jak mock, stub, fake, spy i dummy.

Czytaj dalej...

Kurs TDD cz. 18 — NSubstitute

Pora przyjrzeć się trzeciemu najpopularniejszemu darmowemu frameworkowi do tworzenia atrap w .NET – NSubstitute.

Czytaj dalej...

Kurs TDD cz. 17 — FakeItEasy

Dziś w kursie TDD przyjrzymy się frameworkowi do tworzenia atrap, konkurencyjnemu do wcześniej poznanego Moq. FakeItEasy, bo o nim mowa, jest darmowy, łatwy w nauce, ma wsparcie dla C# i VB.NET, różni się od innych bibliotek nie tylko semantyką, ale także nieco innym podejściem do tematu tworzenia atrap.

Czytaj dalej...

Kurs TDD cz. 16 — zaawansowane techniki Moq (Argument Matching, Verify, Callback)

W tym artykule przyjrzymy się ciut bardziej zaawansowanym technikom tworzenia atrap przy pomocy Moq: argument matching, verify, callback.

Czytaj dalej...

Kurs TDD cz. 15 — Wstęp do Moq

Moq to najpopularniejszy framework do tworzenia atrap w .NET. W tej części kursu poznamy jego składnię i podstawowe możliwości.

Czytaj dalej...

Kurs TDD cz. 14 — Testowanie zależności (atrapy obiektów)

W części czternastej kursu Test-Driven Development omówimy technikę testowania zależności za pomocą atrap (ang. mock).

Czytaj dalej...

„Płynne asercje”, czyli jak ułatwić sobie życie korzystając z Fluent Assertions?

Wzorzec projektowy fluent interface (polski odpowiednik... płynny interfejs?) przyjął się w środowisku .NET-owym bardzo dobrze. I słusznie! "Płynna syntaktyka" znacznie poprawia czytelność pisanego kodu. Jednym z sztandarowych przykładów jej użycia są asercje w testach, np. przy wsparciu biblioteki Fluent Assertions

Czytaj dalej...

Automatyczne generowanie testów jednostkowych — IntelliTest

IntelliTest to wewnętrzna funkcjonalność Visual Studio, która służy do generowania tabeli danych wejściowych oraz zestawu testów jednostkowych. Dla danej metody generowane są dane wejściowe, w oparciu których mogą zostać wygenerowane testy jednostkowe. Przypadki testowe tworzone są w oparciu o analizę każdego skoku warunkowego (conditional branch).

Czytaj dalej...

Lista narzędzi i frameworków do testowania (TDD / BDD / ATDD / itd.) dla .NET

Postanowiłem kiedyś stworzyć, na własne potrzeby, spis narzędzi dla TDD dla .NET. Z czasem, lista rozrosła się do narzędzi nie tylko związanych z TDD, ale także z testami akceptacyjnymi i BDD. Dokończyłem ten spis o pozostałe rodzaje testów i opublikowałem na GitHubie, tak żeby można było łatwiej aktualizować.

Czytaj dalej...

Kurs TDD cz. 13 — Testowanie wywołań asynchronicznych (async await)

C# 5.0 wniósł wiele dobroci, m.in. obsługę wywołań asynchronicznych za pomocą słów kluczowych async i await. Rozwiązanie, ze względu na prostotę obsługi i skuteczność, cieszy się do dziś sporą popularnością. Jak testować wywołania asynchroniczne? Tego dowiemy się w tym odcinku!

Czytaj dalej...

Kurs TDD cz. 12 — Classic vs. Constraint Assert Model

Rzecz być może dla niektórych mało istotna, dla niektórych w ogóle nie istotna, ale niezależnie od istotności sprawy – myślę, że warta wpisu na blogu. NUnit posiada dwa modele asercji: Classic Assert Model oraz Constraint-Based Assert Model.

Czytaj dalej...

Kurs TDD cz. 11 — Testowanie klas generycznych

W niniejszym artykule przyjrzymy się w jaki sposób możemy przetestować klasy generyczne za pomocą funkcjonalności NUnita pod nazwą Generic Test Fixture.

Czytaj dalej...

Kurs TDD cz. 10 — Teorie

Teoria jest specjalnym rodzajem testu, w którym weryfikujemy dane twierdzenie przy pomocy założeń (assumptions).

Czytaj dalej...

Kurs TDD cz. 9 — Testy kombinatoryczne i sekwencyjne

Naturalnym krokiem po omówieniu testów parametryzowanych jest przejście do testów kombinatorycznych i sekwencyjnych. Do dyspozycji mamy dwa atrybuty NUnita — [Combinatorial] oraz [Sequential].

Czytaj dalej...

C# — Nested object initializer syntax

W C# istnieje mało znana składnia do inicjalizacji zagnieżdzonych obiektów (nested object initializer syntax).

Czytaj dalej...

Kurs TDD cz. 8 — Testy parametryzowane

Celem testów parametryzowanych jest przekazanie zestawu wartości danych do metody testowej. Każdy zestaw danych jest traktowany jako osobny test.

Czytaj dalej...

Kurs TDD cz. 7 — Inicjalizacja i czyszczenie danych (SetUp i TearDown)

W tej części kursu zajmiemy się pojęciem inicjalizacji i czyszczenia danych.

Czytaj dalej...

Kurs TDD cz. 6 — Dobre i złe praktyki testów jednostkowych

W tej części opisane zostaną dobre i złe praktyki stosowane przy pisaniu testów jednostkowych.

Czytaj dalej...

Kurs TDD cz. 5 — Nasz drugi test jednostkowy

W tej części omówię jak wykonać kilka prostych technik, tj. jak zgrupować testy za pomocą atrybutu [TestCase], testować wyjątki, testować zdarzenia.

Czytaj dalej...

Kurs TDD cz. 4 — Nasz pierwszy test jednostkowy

W tej części cyklu stworzymy nasz pierwszy test jednostkowy. Przedstawię krok po kroku jak napisać i przetestować prostą funkcjonalność wedle zasad TDD.

Czytaj dalej...

Kurs TDD cz. 3 — Struktura testu, czyli Arrange-Act-Assert

Czas na omówienie jak, strukturalnie, powinien wyglądać wzorcowy test jednostkowy (Arrange-Act-Assert).

Czytaj dalej...

Cytaty o TDD

Garść cytatów w kontekście Test Driven Development. Można je wykorzystać przy różnych okazjach, np. przy tworzeniu prezentacji albo przy rodzinnych bankietach ;)

Czytaj dalej...

Kurs TDD cz. 2 — Testy jednostkowe a testy integracyjne — różnice

W części drugiej kursu przyjrzymy się rodzajom testów w świecie Test-Driven Development i poznamy różnice między testami jednostkowymi, a integracyjnymi.

Czytaj dalej...

Kurs TDD cz. 1 — Wstęp do TDD

Swój pierwszy wpis na blogu zacznę od części numeros unos cyklu poświęconemu Test-Driven Development. TDD w ostatnim czasie święci triumfy i to nie bez powodu. Dlaczego tak jest i czy gra jest warta świeczki?

Czytaj dalej...