diff -r 591369704df0 -r cb3974daced5 testing-debugging/slides.org --- a/testing-debugging/slides.org Thu Nov 11 23:44:59 2010 +0530 +++ b/testing-debugging/slides.org Fri Nov 12 02:01:28 2010 +0530 @@ -36,23 +36,18 @@ - Need for coding style and some of the standards followed by the Python Community. - Handling Errors and Exceptions. - * gcd function - Create gcd.py file with: -#+begin_LaTeX -\begin{lstlisting}[language=python] +#+begin_src python def gcd(a, b): if a % b == 0: return b return gcd(b, a%b) -\end{lstlisting} -#+end_LaTeX +#+end_src python * Test for gcd.py - Edit gcd.py file -#+begin_LaTeX -\begin{lstlisting}[language=python] - +#+begin_src python def gcd(a, b): if b == 0: return a @@ -63,13 +58,11 @@ if result != 16: print "Test failed" print "Test Passed" -\end{lstlisting} -#+end_LaTeX + +#+end_src * Automating tests -#+begin_LaTeX -\begin{lstlisting}[language=python] - +#+begin_src python if __name=__='__main__': for line in open('numbers.txt'): numbers = line.split() @@ -79,8 +72,138 @@ if gcd(x, y) != result: print "Failed gcd test for", x, y +#+end_src + +* Question 1 + For the same inputs as gcd write automated tests for LCM. +* Solution 1 +#+begin_src python + def gcd(a, b): + if a % b == 0: + return b + return gcd(b, a%b) + + def lcm(a, b): + return (a * b) / gcd(a, b) + + if __name__ == '__main__': + for line in open('lcmtestcases.txt'): + numbers = line.split() + x = int(numbers[0]) + y = int(numbers[1]) + result = int(numbers[2]) + if lcm(x, y) != result: + print "Failed lcm test for", x, y + +#+end_src + +* Meaning full names +#+begin_src python + + amount = 12.68 + denom = 0.05 + nCoins = round(amount / denom) + rAmount = nCoins * denom + +#+end_src + +* Code style + - Four Space Indentation + - 79 character limit on a line + - Funtions should be seperated by + blank line + - Use Docstring + - White space around operators + - l = 32 % 4 + +* Question 2 + - Give meaningful names to the variables in following + code + + - c = a / b + +* Solution 2 +#+begin_src python + + quotient = dividend / divisor + +#+end_src + +* Code Snippet +#+begin_src python + + while True print 'Hello world' + +#+end_src + +* Error +#+begin_latex +\begin{lstlisting} + while True print 'Hello world' + \end{lstlisting} + \begin{lstlisting} + File "", line 1, in ? + while True print 'Hello world' +SyntaxError: invalid syntax \end{lstlisting} -#+end_LaTeX +#+end_latex + +* Code Snippet +#+begin_src python + a = raw_input("Enter a number") + try: + num = int(a) + except: + print "Wrong input ..." + +#+end_src + +* Using idb +#+begin_latex +\small +\begin{lstlisting} +In []: import mymodule +In []: mymodule.test() +--------------------------------------------- +NameError Traceback (most recent call last) + in () +mymodule.py in test() + 1 def test(): + 2 total=1+1 +----> 3 print spam +NameError: global name 'spam' is not defined + +In []: %debug +> mymodule.py(2)test() + 0 print spam +ipdb> total +2 +\end{lstlisting} + +#+end_latex +* Summary + - Create simple tests for a function. + - Learn to Automate tests using many predefined test cases. + - Good coding standards. + - Difference between syntax error and exception. + - Handling exception using try and except. + - Using %debug for debugging on ipython. + +* Thank you! +#+begin_latex + \begin{block}{} + \begin{center} + This spoken tutorial has been produced by the + \textcolor{blue}{FOSSEE} team, which is funded by the + \end{center} + \begin{center} + \textcolor{blue}{National Mission on Education through \\ + Information \& Communication Technology \\ + MHRD, Govt. of India}. + \end{center} + \end{block} +#+end_latex +