diff options
author | Srikant | 2012-01-24 16:13:23 +0530 |
---|---|---|
committer | Srikant | 2012-01-24 16:13:23 +0530 |
commit | b5a5acdddb2ef001e9c97a2959b0dbff9096423c (patch) | |
tree | 08a3a15ddeceb476a8f175ed6f9ac8fe7353e85c /TDD/getting_started_with_tdd | |
parent | a3e5c61aba9df89897fab9c8efc04bdb89ce2034 (diff) | |
download | sdes-stscripts-b5a5acdddb2ef001e9c97a2959b0dbff9096423c.tar.gz sdes-stscripts-b5a5acdddb2ef001e9c97a2959b0dbff9096423c.tar.bz2 sdes-stscripts-b5a5acdddb2ef001e9c97a2959b0dbff9096423c.zip |
removed the old slide.tex
Diffstat (limited to 'TDD/getting_started_with_tdd')
-rw-r--r-- | TDD/getting_started_with_tdd/slide.tex | 352 |
1 files changed, 0 insertions, 352 deletions
diff --git a/TDD/getting_started_with_tdd/slide.tex b/TDD/getting_started_with_tdd/slide.tex deleted file mode 100644 index 54875f9..0000000 --- a/TDD/getting_started_with_tdd/slide.tex +++ /dev/null @@ -1,352 +0,0 @@ -\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} |