\documentclass[17pt,compress]{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} \usepackage{beamerthemesplit} \mode { \usetheme{Warsaw} \useoutertheme{infolines} \setbeamercovered{transparent} \setbeamertemplate{navigation symbols}{} } % Taken from Fernando's slides. \usepackage{ae,aecompl} \usepackage[scaled=.95]{helvet} \usepackage[english]{babel} %\usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} % change the alerted colour to LimeGreen \definecolor{LimeGreen}{RGB}{50,205,50} \setbeamercolor{structure}{fg=LimeGreen} \author[FOSSEE]{} \institute[IIT Bombay]{} \date[]{} % \setbeamercovered{transparent} % theme split \newenvironment{colorverbatim}[1][]% {% \color{blue} \verbatim }% {% \endverbatim }% \usepackage{verbatim} \usepackage{mathpazo,courier,euler} \usepackage{listings} \lstset{language=sh, basicstyle=\ttfamily\bfseries, showstringspaces=false, keywordstyle=\color{black}\bfseries} \newcommand{\typ}[1]{\lstinline{#1}} %\newcommand{\kwrd}[1]{ \texttt{\textbf{\color{blue}{#1}}} } % logo \logo{\includegraphics[height=1.30 cm]{../images/3t-logo.pdf}} \logo{\includegraphics[height=1.30 cm]{../images/fossee-logo.pdf} \hspace{7.5cm} \includegraphics[scale=0.99]{../images/fossee-logo.pdf}\\ \hspace{281pt} \includegraphics[scale=0.80]{../images/3t-logo.pdf}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % DOCUMENT STARTS \begin{document} \sffamily \bfseries \title [Getting started with TDD] {Getting started with TDD} \author [FOSSEE] {\small Talk to a Teacher\\{\color{blue}\url{http://spoken-tutorial.org}} \\\vspace{0.25cm}National Mission on Education through ICT\\{\color{blue}\url{ http://sakshat.ac.in}} \\ [1.65cm] Contributed by FOSSEE Team \\IIT Bombay \\[0.3cm] } % slide 1 \begin{frame} \titlepage \end{frame} \begin{frame} \frametitle{Objectives} At the end of this tutorial, you will be able to, \begin{itemize} \item Understand basics of Test Driven Development \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, \begin{itemize} \item Getting started with functions \end{itemize} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame} \frametitle{What is TDD?} The basic steps of TDD are, \begin{itemize} \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 \end{itemize} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame} \frametitle{What is TDD?..} \begin{itemize} \item Modify the code to pass all current tests \& previous tests \item Run the tests to see if all tests pass \item Refactor the code -- optimize the algorithm, remove duplication, add documentation, etc. \item Run the tests again \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{First Test -- fibonacci} \begin{itemize} \item What are our code units? \begin{itemize} \item Only one function \texttt{fibonacci} \item Takes one number as argument \item Returns, nth number of fibonacci series \end{itemize} \begin{lstlisting} c = fibonacci(3) \end{lstlisting} \item c contains 3rd digit of the 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 before writing tests \item $n=3$, $fibonacci=2$ \item $n=4$, $fibonacci=3$ \item Tests are just a series of assertions \item True or False, depending on the behaviour \end{itemize} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}[fragile] \frametitle{Test Cases -- Code} \small { \begin{lstlisting} tc1 = fibonacci(3) if tc1 != 2: print "Failed for n=3. Expected 2. \ Obtained %d instead." % tc1 exit(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{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{fibonacci} \begin{lstlisting} 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{fibonacci.py}} \tiny { \begin{lstlisting} def fibonacci(n): pass if __name__ == '__main__': tc1 = fibonacci(3) if tc1 != 2: print "Failed for n=3. \ Expected 2. Obtained %d instead." % tc1 exit(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} } \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}[fragile] \frametitle{First run} \small { \begin{lstlisting} $ python fibonacci.py Traceback (most recent call last): File "fibonacci.py", line 8, in print "Failed for n=3. Expected 2. 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{Fibonacci} \begin{itemize} \item Modify the \texttt{fibonacci} stub function \item Then, run the script to see if the tests pass. \end{itemize} \small { \begin{lstlisting} def fibonacci(n): a, b = 0, 1 for i in range(n): a, b = b, a + b return a \end{lstlisting} \begin{lstlisting} \end{lstlisting} %$ } \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}[fragile] \frametitle{Fibonacci -- Recursive} \begin{itemize} \item Final improvement -- make \texttt{fibonacci} recursive \tiny { \begin{lstlisting} def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) \end{lstlisting} } \small \item More readable and easier to understand \item Check that the tests pass again \end{itemize} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame} \frametitle{Summary} \label{sec-8} In this tutorial, we learnt, \begin{itemize} \item The basic steps involved in Test driven development \item How to use test cases \item How to write simple tests for a function \end{itemize} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}[fragile] \frametitle{Evaluation} \label{sec-9} \begin{enumerate} \item Design a TDD approach for a \texttt{factorial} function \vspace{8pt} \item Design a TDD approach for an \texttt{armstrong} function \end{enumerate} \end{frame} \begin{frame}[fragile] \frametitle{Factorial} \label{sec-10} \begin{itemize} \item {\tiny \begin{lstlisting} def factorial(n): if n < 0 : return None; if n == 1: return 1 else: return n * factorial (n - 1) if __name__ == '__main__': f = factorial(3) if f != 6 : print 'Test Failed...' exit (1) f = factorial(-5) if f != None : print 'Test Failed...' exit (1) print 'All tests passed...' \end{lstlisting} } \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Armstrong} \label{sec-10} \begin{itemize} \item {\tiny \begin{lstlisting} def armstrong(n): sum, remainder = 0 temp = n while temp > 0 : remainder = temp % 10 sum = sum + remainder * remainder * remainder temp = temp / 10 if n == sum: return True else: return False if __name__ == '__main__': is_armstrong = armstrong(0) if is_armstrong != True: print "this is not armstrong" exit(1) is_armstrong = armstrong(371) if is_armstrong == True: print "this is armstrong" exit(1) print 'All tests passed...' \end{lstlisting} } \end{itemize} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame} \frametitle{SDES \& FOSSEE} \begin{center} \begin{itemize} \item \small{SDES}\\ \small{\color{LimeGreen}Software Development techniques for Engineers and Scientists} \\ \scriptsize An initiative by FOSSEE. \\ \vspace{3pt} \scriptsize For more information on SDES, please visit {\color{blue}\url{http://fossee.in/sdes}}\\ \vspace{12pt} \item \small{FOSSEE}\\ \small {\color{LimeGreen}Free and Open-source Software for \\ Science and Engineering Education} \\ \scriptsize Based at IIT Bombay, Funded by MHRD.\\ \vspace{3pt} \scriptsize Part of National Mission on Education through ICT (NME-ICT) \\ \end{itemize} \end{center} \end{frame} \begin{frame} \frametitle{About the Spoken Tutorial Project} \begin{itemize} \item Watch the video available at {\color{blue}\url{http://spoken-tutorial.org /What\_is\_a\_Spoken\_Tutorial}} \item It summarises the Spoken Tutorial project \item If you do not have good bandwidth, you can download and watch it \end{itemize} \end{frame} \begin{frame} \frametitle{Spoken Tutorial Workshops}The Spoken Tutorial Project Team \begin{itemize} \item Conducts workshops using spoken tutorials \item Gives certificates to those who pass an online test \item For more details, please write to \\ \hspace {0.5cm} {\color{blue}contact@spoken-tutorial.org} \end{itemize} \end{frame} \begin{frame} \frametitle{Acknowledgements} \begin{itemize} \item Spoken Tutorial Project is a part of the Talk to a Teacher project \item It is supported by the National Mission on Education through ICT, MHRD, Government of India \item More information on this Mission is available at: \\ {\color{blue}\url{http://spoken-tutorial.org/NMEICT-Intro}} \end{itemize} \end{frame} \begin{frame} \begin{block}{} \begin{center} {\Large THANK YOU!} \end{center} \end{block} \begin{block}{} \begin{center} For more Information, visit our website\\ {\color{blue}\url{http://fossee.in/}} \end{center} \end{block} \end{frame} \end{document}