summaryrefslogtreecommitdiff
path: root/TDD/getting_started_with_tdd
diff options
context:
space:
mode:
Diffstat (limited to 'TDD/getting_started_with_tdd')
-rw-r--r--TDD/getting_started_with_tdd/tdd1.tex (renamed from TDD/getting_started_with_tdd/slide.tex)262
-rwxr-xr-xTDD/getting_started_with_tdd/tdd1_script.rst205
2 files changed, 312 insertions, 155 deletions
diff --git a/TDD/getting_started_with_tdd/slide.tex b/TDD/getting_started_with_tdd/tdd1.tex
index 54875f9..f056ce5 100644
--- a/TDD/getting_started_with_tdd/slide.tex
+++ b/TDD/getting_started_with_tdd/tdd1.tex
@@ -22,68 +22,58 @@ commentstyle=\color{red}\itshape, stringstyle=\color{green},
showstringspaces=false, keywordstyle=\color{blue}\bfseries}
\providecommand{\alert}[1]{\textbf{#1}}
-\title{Getting started with TDD}
+\title{SEES: Test Driven Development}
\author{FOSSEE}
-\institute{IIT Bombay}
\usetheme{Warsaw}\usecolortheme{default}\useoutertheme{infolines}\setbeamercovered{transparent}
-\AtBeginSection[]
-{
- \begin{frame}<beamer>
- \frametitle{Outline}
- \tableofcontents[currentsection]
- \end{frame}
-}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
\begin{document}
\begin{frame}
-
\begin{center}
\vspace{12pt}
-\textcolor{blue}{\huge Getting started with Test Driven Development}
+\textcolor{blue}{\huge Test Driven Development \\Part I}
\end{center}
\vspace{18pt}
\begin{center}
\vspace{10pt}
-\includegraphics[scale=0.95]{../../images/fossee-logo.png}\\
+\includegraphics[scale=0.95]{../images/fossee-logo.png}\\
\vspace{5pt}
\scriptsize Developed by FOSSEE Team, IIT-Bombay. \\
\scriptsize Funded by National Mission on Education through ICT\\
\scriptsize MHRD,Govt. of India\\
-\includegraphics[scale=0.30]{../../images/iitb-logo.png}\\
+\includegraphics[scale=0.30]{../images/iitb-logo.png}\\
\end{center}
\end{frame}
-
-\begin{frame}
-\frametitle{Outline}
-\setcounter{tocdepth}{3}
-\tableofcontents
-\end{frame}
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Introduction}
\begin{frame}
\frametitle{Objectives}
- At the end of this section, you will be able to:
+ At the end of this tutorial, you will be able to,
\begin{itemize}
- \item Understand the concept of Test Driven Development.
- \item Write your code using the TDD paradigm.
+ \item Know what is TDD.
+ \item Understand the use of test cases.
+ \item Write simple tests for a function.
+
\end{itemize}
\end{frame}
-
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Pre-requisite}
\label{sec-3}
-Spoken tutorial on Basic Python
+Spoken tutorial on -
\begin{itemize}
-\item Topic of tutorial here
+\item Getting started with functions.
\end{itemize}
\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{What is TDD?}
@@ -99,106 +89,107 @@ Spoken tutorial on Basic Python
\item Refactor the code you've just written -- optimize the algorithm,
remove duplication, add documentation, etc.
\item Run the tests again, to see that all the tests still pass.
- \item Go back to 1.
+
\end{enumerate}
\end{frame}
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{First Test}
\begin{frame}[fragile]
- \frametitle{First Test -- GCD}
+ \frametitle{First Test -- fibonacci}
\begin{itemize}
- \item simple program -- GCD of two numbers
+ \item simple program -- Returns nth fibonacci number
\item What are our code units?
\begin{itemize}
- \item Only one function \texttt{gcd}
- \item Takes two numbers as arguments
- \item Returns one number, which is their GCD
+ \item Only one function \texttt{fibonacci}
+ \item Takes one number as argument
+ \item Returns one number, which is the nth number of fibonacci series.
\end{itemize}
\begin{lstlisting}
-c = gcd(44, 23)
+c = fibonacci(3)
\end{lstlisting}
- \item c will contain the GCD of the two numbers.
+ \item c will contain 3rd number of fibonacci series,counting from 0.
\end{itemize}
\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
\frametitle{Test Cases}
\begin{itemize}
\item Important to have test cases and expected outputs even before
writing the first test!
- \item $a=48$, $b=48$, $GCD=48$
- \item $a=44$, $b=19$, $GCD=1$
+ \item $n=3$, $fibonacci=2$
+ \item $n=4$, $fibonacci=3$
\item Tests are just a series of assertions
\item True or False, depending on expected and actual behavior
\end{itemize}
-
\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
\frametitle{Test Cases -- Code}
\begin{lstlisting}
-tc1 = gcd(48, 64)
-if tc1 != 16:
- print "Failed for a=48, b=64. Expected 16. \
+tc1 = fibonacci(3)
+if tc1 != 2:
+ print "Failed for n=3. Expected 2. \
Obtained %d instead." % tc1
exit(1)
-tc2 = gcd(44, 19)
-if tc2 != 1:
- print "Failed for a=44, b=19. Expected 1. \
+tc2 = fibonacci(4)
+if tc2 != 3:
+ print "Failed for n=4. Expected 3. \
Obtained %d instead." % tc2
exit(1)
print "All tests passed!"
\end{lstlisting}
\begin{itemize}
-\item The function \texttt{gcd} doesn't even exist!
+\item The function \texttt{fibonacci} doesn't even exist!
\end{itemize}
\end{frame}
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
\frametitle{Stubs}
\begin{itemize}
- \item First write a very minimal definition of \texttt{gcd}
+ \item First write a very minimal definition of \texttt{fibonacci}
\begin{lstlisting}
-def gcd(a, b):
+def fibonacci(a):
pass
\end{lstlisting}
\item Written just, so that the tests can run
\item Obviously, the tests are going to fail
\end{itemize}
\end{frame}
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
- \frametitle{\texttt{gcd.py}}
+ \frametitle{\texttt{fibonacci.py}}
\begin{lstlisting}
-def gcd(a, b):
+def fibonacci(n):
pass
if __name__ == '__main__':
- tc1 = gcd(48, 64)
- if tc1 != 16:
- print "Failed for a=48 and b=64. \
- Expected 16. Obtained %d instead." % tc1
+ tc1 = fibonacci(3)
+ if tc1 != 2:
+ print "Failed for n=3. \
+ Expected 2. Obtained %d instead." % tc1
exit(1)
- tc2 = gcd(44, 19)
- if tc2 != 1:
- print "Failed for a=44 and b=19. \
- Expected 1. Obtained %d instead." % tc2
+ tc2 = fibonacci(4)
+ if tc2 != 3:
+ print "Failed for n=4. \
+ Expected 3. Obtained %d instead." % tc2
exit(1)
print "All tests passed!"
\end{lstlisting}
\end{frame}
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
\frametitle{First run}
\begin{lstlisting}
-$ python gcd.py
+$ python fibonacci.py
Traceback (most recent call last):
- File "gcd.py", line 7, in <module>
- print "Failed for a=48 and b=64. Expected 16.
+ File "fibonacci.py", line 8, in <module>
+ print "Failed for n=3. Expected 2.
Obtained %d instead." % tc1
TypeError: %d format:
a number is required, not NoneType
@@ -209,130 +200,90 @@ a number is required, not NoneType
\item The next step is to write code, so that the test just passes.
\end{itemize}
\end{frame}
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
\frametitle{Euclidean Algorithm}
\begin{itemize}
- \item Modify the \texttt{gcd} stub function
+ \item Modify the \texttt{fibonacci} stub function
\item Then, run the script to see if the tests pass.
\end{itemize}
\begin{lstlisting}
-def gcd(a, b):
- if a == 0:
- return b
- while b != 0:
- if a > b:
- a = a - b
- else:
- b = b - a
+def fibonacci(n):
+ a, b = 0, 1
+ for i in range(n):
+ a, b = b, a + b
return a
+
\end{lstlisting}
\begin{lstlisting}
-$ python gcd.py
+$ python fibonacci.py
All tests passed!
\end{lstlisting} %$
\begin{itemize}
\item \alert{Success!}
\end{itemize}
\end{frame}
-
-
-\begin{frame}[fragile]
- \frametitle{Euclidean Algorithm -- Modulo}
- \begin{itemize}
- \item Repeated subtraction can be replaced by a modulo
- \item modulo of \texttt{a\%b} is always less than b
- \item when \texttt{a < b}, \texttt{a\%b} equals \texttt{a}
- \item Combine these two observations, and modify the code
-\begin{lstlisting}
-def gcd(a, b):
- while b != 0:
- a, b = b, a % b
- return a
-\end{lstlisting}
- \item Check that the tests pass again
- \end{itemize}
-\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
\frametitle{Euclidean Algorithm -- Recursive}
\begin{itemize}
- \item Final improvement -- make \texttt{gcd} recursive
+ \item Final improvement -- make \texttt{fibonacci} recursive
\item More readable and easier to understand
\begin{lstlisting}
-def gcd(a, b):
- if b == 0:
- return a
- return gcd(b, a%b)
+def fibonacci(n):
+ if n == 0:
+ return 0
+ elif n == 1:
+ return 1
+ else:
+ return fibonacci(n-1) + fibonacci(n-2)
+
\end{lstlisting}
\item Check that the tests pass again
\end{itemize}
\end{frame}
-\begin{frame}[fragile]
- \frametitle{Document \texttt{gcd}}
- \begin{itemize}
- \item Undocumented function is as good as unusable
- \item Let's add a docstring \& We have our first test!
- \end{itemize}
-\begin{lstlisting}
-def gcd(a, b):
- """Returns the Greatest Common Divisor of the
- two integers passed as arguments.
-
- Args:
- a: an integer
- b: another integer
-
- Returns: Greatest Common Divisor of a and b
- """
- if b == 0:
- return a
- return gcd(b, a%b)
-\end{lstlisting}
-\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}
+\frametitle{Summary}
+\label{sec-8}
-\begin{frame}[fragile]
- \frametitle{Persistent Test Cases}
- \begin{itemize}
- \item Tests should be pre-determined and written, before the code
- \item Test Data is repeatedly used; Hence, saved in persistent
- format
- \item Let's save data for GCD tests in a text file.
- \item The file shall have multiple lines of test data
- \item Each line corresponds to a single test case
- \item Each line consists of three comma separated values --
- \begin{itemize}
- \item First two coloumns are the integers for which the GCD has to be
- computed
- \item Third coloumn is the expected GCD to the preceding two
- numbers.
- \end{itemize}
- \item Let us call our data file \texttt{gcd\_testcases.dat}
- \end{itemize}
+ In this tutorial, we have learnt to,
+
+
+\begin{itemize}
+\item Undestand the basic steps involved in Test driven development.
+\item Design a TDD approach for a given \texttt{fibonacci} function.
+
+\end{itemize}
\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile]
- \frametitle{Modify \texttt{gcd.py}}
-\begin{lstlisting}
-if __name__ == '__main__':
- for line in open('gcd_testcases.dat'):
- values = line.split(', ')
- a = int(values[0])
- b = int(values[1])
- g = int(values[2])
-
- tc = gcd(a, b)
- if tc != g:
- print "Failed for a=%d and b=%d.\
- Expected %d. Obtained %d instead."\
- % (a, b, g, tc)
- exit(1)
+\frametitle{Evaluation}
+\label{sec-9}
- print "All tests passed!"
-\end{lstlisting}
+
+\begin{enumerate}
+\item ?
+\vspace{8pt}
+\item ?
+\end{enumerate}
+\end{frame}
+\begin{frame}
+\frametitle{Solutions}
+\label{sec-10}
+
+
+\begin{enumerate}
+\item
+\vspace{15pt}
+\item
+\end{enumerate}
\end{frame}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
@@ -349,4 +300,5 @@ if __name__ == '__main__':
\end{block}
\end{frame}
+
\end{document}
diff --git a/TDD/getting_started_with_tdd/tdd1_script.rst b/TDD/getting_started_with_tdd/tdd1_script.rst
new file mode 100755
index 0000000..9da1613
--- /dev/null
+++ b/TDD/getting_started_with_tdd/tdd1_script.rst
@@ -0,0 +1,205 @@
+.. Objectives
+.. ----------
+
+ .. At the end of this tutorial, you will be able to:
+
+ .. 1. Know what is TDD.
+ .. 2. Understand the use of test cases.
+ .. 3. Write simple tests for a function.
+
+.. Prerequisites
+.. -------------
+
+.. 1. Getting started with functions
+
+
+Script
+------
+
+.. L1
+
+{{{ Show the first slide containing title, name of the production
+team along with the logo of MHRD }}}
+
+.. R1
+
+Hello friends and Welcome to the tutorial on
+'Test driven development - Part 1'.
+
+.. L2
+
+{{{ Show slide with objectives }}}
+
+.. R2
+
+At the end of this tutorial, you will be able to,
+
+ 1. understand basics of Test Driven Development.
+ #. understand the use test cases.
+ #. write simple tests for a function.
+
+.. L3
+
+{{{ Switch to the slide3, pre-requisite slide }}}
+
+.. R3
+
+Before beginning this tutorial,we would suggest you to complete the
+tutorial on "Getting started with functions".
+
+.. R4
+
+Test-driven development is a software development
+process that relies on the repetition of a very short
+development cycle.
+In TDD,one writes a failing automated test case that
+defines a desired improvement or new function, then produces
+code to pass that test and finally refactors the new code to
+acceptable standards.
+
+
+.. L4
+
+{{{ Switch to slide4 ,What is TDD?}}}
+
+
+.. R5
+
+To illustrate TDD, lets take a simple program. Consider a
+function ``fibonacci``, that takes one argument and returns
+the nth number of ``fibonacci`` series.
+
+.. L5
+
+{{{ Switch to slide5, First test- fibonacci }}}
+
+.. R6
+
+To test ``fibonacci`` function, we need test
+cases.
+As shown in this slide,
+test cases are expected outputs for a given set of inputs.
+
+
+.. L6
+
+{{{ Switch to slide6, Test cases }}}
+
+.. R7
+
+The sample code for test cases is shown here. Observe that if
+any ``if`` statement is executed, test aborts after printing the
+error message.
+
+.. L7
+
+{{{ Switch to slide7, Test cases-Code }}}
+
+.. R8
+
+The ``fibonacci`` function is written just enough so that
+test can run.
+
+
+.. L8
+
+{{{ switch to slide8, Stubs }}}
+
+.. R9
+
+Combine the function and test cases and put them together in
+``fibonacci.py`` file.Add the test cases after name=main idiom.
+
+.. L9
+
+{{{ Switch to slide9, fibonacci.py }}}
+
+.. R10
+
+Lets run fibonacci.py by typing ``python fibonacci.py``.
+As we haven't written any meaningful code in our ``fibonacci``
+function, it fails immediately.
+Our next step is to write just minimum code to pass our tests.
+
+.. L10
+
+{{{ Run the fibonacci.py in terminal and show the error output.}}}
+::
+
+ python fibonacci.py
+
+.. R11
+
+Modify the fibonacci stub function with given code.
+Save and run it again as `` python fibonacci.py``.
+{{{ pause }}}
+Observe that, there will be no errors, as
+the test passes successfully.
+
+.. L11
+
+{{{ switch to slide-11, Euclidean Algorithm }}}
+Switch to terminal and modify fibonacci function in ``nano``
+editor and run.
+::
+
+ python fibonacci.py
+
+.. R12
+
+The same ``fibonacci`` function is modified to make it more readable
+and easy to understand using recursion.
+Pause this video here.Replace the ``fibonacci`` function with recursive one.
+Run the modified ``fibonacci.py`` file. The test should pass again
+without any errors.
+After successfully achieving this result, you can resume the video.
+
+.. L12
+
+{{{ Show slide12, Euclidean Algorithm- Recursive}}}
+
+
+.. R13
+
+This brings us to the end of the tutorial.In this tutorial,
+ we have learnt to,
+
+ 1. Undestand the basic steps involved in Test driven development.
+ #. Design a Test driven approach for a given ``fibonacci`` function.
+
+
+.. L13
+
+{{{ switch to slide-13,Summary }}}
+
+.. R14
+
+Here are some self assessment questions for you to solve
+ 1.
+
+ 2.
+
+.. L14
+
+{{{ switch to slide-14, Evaluation }}}
+
+.. R15
+
+And the answers are,
+ 1.
+
+ 2.
+
+.. L15
+
+{{{ switch to slide-15 ,Solutions}}}
+
+.. R16
+
+Hope you have enjoyed this tutorial and found it useful.
+Thank you!
+
+.. L16
+
+{{{ Switch to slide-16, Thankyou}}}
+