Skip to content

Commit c7235ce

Browse files
authored
example for tdd post added
1 parent fcd95e0 commit c7235ce

File tree

1 file changed

+81
-1
lines changed

1 file changed

+81
-1
lines changed

_drafts/2019-02-11-tdd.md

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,84 @@ Wykorzystanie metodyki TDD ma zastosowanie tam gdzie możliwe jest otrzymanie wi
2727
Przechodząc przez kolejne fazy wytwarzania oprogramowania metodyką TDD należy mieć na uwadzę dobre praktyki tworzenia niezależnych, atomowych, czytelnych i krótkich testów jednostkowych. Poza tym dobrze jest znaleźć odpowiedni bilans długości, wielkości i częstotliwości faz cyklów, który wynika z charakterystyki projektu oraz osobistych preferencji programisty. Należy odpo
2828

2929
## Przykład
30-
//TODO
30+
Aplikacja `Kalkulator` ma posiadać funkcję liczenia `ciągu Fibonacciego` dla zadanej wartości. Programista przystępuje najpierw do `napisania testów` oraz `naiwnej implementacji testowanej funkcjonalności` tak, aby przeprowadzenie testu było możliwe i zakończyło się wynikiem negatywnym.
31+
32+
{% highlight kotlin %}
33+
class CalculatorTest {
34+
35+
@Test
36+
fun checkFibonacci() {
37+
assertEquals(0, Calculator.fibonacci(0))
38+
assertEquals(1, Calculator.fibonacci(1))
39+
assertEquals(8, Calculator.fibonacci(6))
40+
}
41+
}
42+
43+
class Calculator {
44+
45+
companion object {
46+
fun fibonacci(n: Int): Int {
47+
return -1
48+
}
49+
}
50+
}
51+
{% endhighlight %}
52+
53+
Uruchomione testy dają `wynik negatywny` zatem programista może przejść do fazy `implementacji funkcjonalności`.
54+
55+
{% highlight kotlin %}
56+
class Calculator {
57+
58+
companion object {
59+
fun fibonacci(n: Int): Int {
60+
if (n == 0)
61+
return 0
62+
else if (n == 1)
63+
return 1
64+
else
65+
return fibonacci(n-1) + fibonacci(n-2)
66+
}
67+
}
68+
}
69+
{% endhighlight %}
70+
71+
Po zakończonej fazie implementacji i pozytywnym przejściu wszystkich testów może nastąpić `faza refactoringu`. Programista dostrzega możliwość poprawienia kodu funkcjonalności o przyjmowany i zwracany typ argumentu oraz poprawienie wydajności. Ponadto zwraca uwagę na potrzebę dodania dodatkowych asercji w testach.
72+
73+
{% highlight kotlin %}
74+
class Calculator {
75+
76+
companion object {
77+
tailrec fun fibonacci(n: Int, a: BigInteger = BigInteger.ZERO, b: BigInteger = BigInteger.ONE): BigInteger {
78+
return if (n == 0)
79+
a
80+
else
81+
fibonacci(n-1, b, a+b)
82+
}
83+
}
84+
}
85+
86+
class CalculatorTest {
87+
88+
@Test
89+
fun checkFibonacci() {
90+
assertEquals(BigInteger.valueOf(0), Calculator.fibonacci(0))
91+
assertEquals(BigInteger.valueOf(1), Calculator.fibonacci(1))
92+
assertEquals(BigInteger.valueOf(1), Calculator.fibonacci(2))
93+
assertEquals(BigInteger.valueOf(8), Calculator.fibonacci(6))
94+
}
95+
96+
@Test(expected = java.lang.IllegalArgumentException::class)
97+
fun checkFibonacciExceptionForMaxNegativeArg() {
98+
fibonacci(-1)
99+
}
100+
101+
@Test(expected = java.lang.IllegalArgumentException::class)
102+
fun checkFibonacciExceptionForMinNegativeArg() {
103+
fibonacci(Int.MIN_VALUE)
104+
}
105+
106+
//add more test for proper max arg value
107+
}
108+
{% endhighlight %}
109+
110+
Przeprowadzone testy dla zmodyfikowanego kodu nadal dają wynik pozytywny. Programista może zatem uznać pełen cykl implementacji funkcji ciągu Fibonacciego za ukończony i przejśc do implementacji kolejnych funkcjonalności aplikacji `Kalkulator`.

0 commit comments

Comments
 (0)