summaryrefslogtreecommitdiff
path: root/TDD/getting_started_with_tdd
diff options
context:
space:
mode:
authorparth2011-09-22 22:02:09 +0530
committerparth2011-09-22 22:02:09 +0530
commitd7427e42df20fdc92fd3b5b336465af61de6ab80 (patch)
tree1c73b4e643db5f4733bd58b5c978db0d9a751399 /TDD/getting_started_with_tdd
downloadsdes-stscripts-d7427e42df20fdc92fd3b5b336465af61de6ab80.tar.gz
sdes-stscripts-d7427e42df20fdc92fd3b5b336465af61de6ab80.tar.bz2
sdes-stscripts-d7427e42df20fdc92fd3b5b336465af61de6ab80.zip
Initial Commit, added TDD slides
Diffstat (limited to 'TDD/getting_started_with_tdd')
-rw-r--r--TDD/getting_started_with_tdd/slide.tex352
1 files changed, 352 insertions, 0 deletions
diff --git a/TDD/getting_started_with_tdd/slide.tex b/TDD/getting_started_with_tdd/slide.tex
new file mode 100644
index 0000000..54875f9
--- /dev/null
+++ b/TDD/getting_started_with_tdd/slide.tex
@@ -0,0 +1,352 @@
+\documentclass[12pt,presentation]{beamer}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{fixltx2e}
+\usepackage{graphicx}
+\usepackage{longtable}
+\usepackage{float}
+\usepackage{wrapfig}
+\usepackage{soul}
+\usepackage{textcomp}
+\usepackage{marvosym}
+\usepackage{wasysym}
+\usepackage{latexsym}
+\usepackage{amssymb}
+\usepackage{hyperref}
+\tolerance=1000
+\usepackage[english]{babel} \usepackage{ae,aecompl}
+\usepackage{mathpazo,courier,euler} \usepackage[scaled=.95]{helvet}
+\usepackage{listings}
+\lstset{language=Python, basicstyle=\ttfamily\bfseries,
+commentstyle=\color{red}\itshape, stringstyle=\color{green},
+showstringspaces=false, keywordstyle=\color{blue}\bfseries}
+\providecommand{\alert}[1]{\textbf{#1}}
+
+\title{Getting started with TDD}
+\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}
+\end{center}
+\vspace{18pt}
+\begin{center}
+\vspace{10pt}
+\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}\\
+\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:
+ \begin{itemize}
+ \item Understand the concept of Test Driven Development.
+ \item Write your code using the TDD paradigm.
+ \end{itemize}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Pre-requisite}
+\label{sec-3}
+
+Spoken tutorial on Basic Python
+\begin{itemize}
+\item Topic of tutorial here
+\end{itemize}
+\end{frame}
+
+
+\begin{frame}
+ \frametitle{What is TDD?}
+ The basic steps of TDD are roughly as follows --
+ \begin{enumerate}
+ \item Decide upon the feature to implement and the methodology of
+ testing it.
+ \item Write the tests for the feature decided upon.
+ \item Just write enough code, so that the test can be run, but it fails.
+ \item Improve the code, to just pass the test and at the same time
+ passing all previous tests.
+ \item Run the tests to see, that all of them run successfully.
+ \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}
+ \begin{itemize}
+ \item simple program -- GCD of two numbers
+ \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
+ \end{itemize}
+\begin{lstlisting}
+c = gcd(44, 23)
+\end{lstlisting}
+ \item c will contain the GCD of the two numbers.
+ \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 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. \
+ Obtained %d instead." % tc1
+ exit(1)
+
+tc2 = gcd(44, 19)
+if tc2 != 1:
+ print "Failed for a=44, b=19. Expected 1. \
+ Obtained %d instead." % tc2
+ exit(1)
+
+print "All tests passed!"
+\end{lstlisting}
+\begin{itemize}
+\item The function \texttt{gcd} 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}
+ \begin{lstlisting}
+def gcd(a, b):
+ 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}}
+\begin{lstlisting}
+def gcd(a, b):
+ 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
+ exit(1)
+ tc2 = gcd(44, 19)
+ if tc2 != 1:
+ print "Failed for a=44 and b=19. \
+ Expected 1. 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
+Traceback (most recent call last):
+ File "gcd.py", line 7, in <module>
+ print "Failed for a=48 and b=64. Expected 16.
+ Obtained %d instead." % tc1
+TypeError: %d format:
+a number is required, not NoneType
+\end{lstlisting} %$
+
+ \begin{itemize}
+ \item We have our code unit stub, and a failing test.
+ \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 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
+ return a
+\end{lstlisting}
+\begin{lstlisting}
+$ python gcd.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 More readable and easier to understand
+\begin{lstlisting}
+def gcd(a, b):
+ if b == 0:
+ return a
+ return gcd(b, a%b)
+\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}[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}
+\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)
+
+ print "All tests passed!"
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}
+
+ \begin{block}{}
+ \begin{center}
+ \textcolor{blue}{\Large THANK YOU!}
+ \end{center}
+ \end{block}
+\begin{block}{}
+ \begin{center}
+ For more Information, visit our website\\
+ \url{http://fossee.in/}
+ \end{center}
+ \end{block}
+\end{frame}
+
+\end{document}