Show
Ignore:
Timestamp:
06/01/07 16:36:20 (19 months ago)
Author:
Tarek Ziad?? <tarek@…>
Message:

fin partie 1

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • JFP/slides.html

    r104 r105  
    66<meta name="generator" content="Docutils 0.4: http://docutils.sourceforge.net/" /> 
    77<meta name="version" content="S5 1.1" /> 
    8 <title>RuPy'07</title> 
     8<title>JPF'07</title> 
    99<style type="text/css"> 
    1010 
     
    316316</div> 
    317317<div id="footer"> 
    318 <h1>RuPy'07</h1> 
     318<h1>JPF'07</h1> 
    319319 
    320320</div> 
     
    322322<div class="presentation"> 
    323323<div class="slide" id="slide0"> 
    324 <h1 class="title">RuPy'07</h1> 
    325 <p>Agile documentation in Python projects</p> 
     324<h1 class="title">JPF'07</h1> 
     325<p>Le Document-Driven Developpement (DDD)</p> 
    326326<table class="docutils field-list" frame="void" rules="none"> 
    327327<col class="field-name" /> 
     
    339339 
    340340</div> 
    341 <div class="slide" id="how-am-i"> 
    342 <h1>How am I ?</h1> 
    343 <ul class="simple"> 
    344 <li>Python developer since 2000</li> 
    345 <li>Core developer in Nuxeo CPS (Zope) for 3 years</li> 
    346 <li>Involved in Zope sprints</li> 
    347 <li>Author of<ul> 
    348 <li>a French book &quot;Programmation Python&quot; (Eyrolles, 2006)</li> 
    349 <li>another one coming up this summer</li> 
    350 <li>articles in magazines</li> 
    351 </ul> 
    352 </li> 
    353 <li>Creator of AFPY (french speaking PUG)</li> 
    354 <li>CTO at Emencia, for a Python e-commerce framework</li> 
    355 </ul> 
    356 </div> 
    357 <div class="slide" id="what-are-the-goals-of-this-presentation"> 
    358 <h1>What are the goals of this presentation ?</h1> 
    359 <p>The main goal is to understand how Agile documentation works in Python, 
    360 through:</p> 
    361 <ul class="simple"> 
    362 <li>Understanding how Test-Driven Development works in Python</li> 
    363 <li>Discovering reStructuredText and doctests</li> 
    364 <li>Understanding how Document-Driven Developement works</li> 
    365 <li>Learning a few patterns</li> 
    366 </ul> 
     341<div class="slide" id="qui-suis-je"> 
     342<h1>Qui suis-je ?</h1> 
     343<ul class="simple"> 
     344<li>Développeur Python depuis 2000</li> 
     345<li>Auteur d'articles et de livres sur Python</li> 
     346<li>Président de l'AFPY</li> 
     347<li>Passionné par les méthodologies <strong>agiles</strong></li> 
     348</ul> 
     349</div> 
     350<div class="slide" id="pourquoi-cette-pr-sentation"> 
     351<h1>Pourquoi cette présentation?</h1> 
     352<p>Objectifs:</p> 
     353<ul class="simple"> 
     354<li>Sensibiliser les développeurs aux tests</li> 
     355<li>Expliquer comment les tests fonctionnent en Python</li> 
     356<li>Sensibiliser les développeurs au <strong>DDD</strong></li> 
     357<li>Expliquer pourquoi le <strong>reST</strong> et les <strong>doctests</strong> c'est merveilleux</li> 
     358</ul> 
     359<p><img alt="important" src="media/important.png" /> En un mot: comment développer <cite>agile</cite> en Python</p> 
    367360</div> 
    368361<div class="slide" id="id1"> 
    369 <h1>What are the goals of this presentation ?</h1> 
    370 <p>My secret goal is to come to RuPy to see how Ruby works...</p> 
    371 </div> 
    372 <div class="slide" id="the-plan"> 
    373 <h1>The plan</h1> 
    374 <ul class="simple"> 
    375 <li><strong>A few definitions</strong></li> 
    376 <li><cite>Part 1: doing TDD in Python</cite></li> 
    377 <li><cite>Part 2: writing documents in reST</cite></li> 
    378 <li><cite>Part 3: writing doctests</cite></li> 
    379 <li><cite>Part 4: doing DDD in Python</cite></li> 
    380 </ul> 
    381 </div> 
    382 <div class="slide" id="a-few-definitions"> 
    383 <h1>A few definitions</h1> 
    384 <p>What kind of documentation are we talking about ?</p> 
     362<h1>Pourquoi cette présentation?</h1> 
     363<p>Objectifs secrets (ne pas montrer ce slide):</p> 
     364<ul class="simple"> 
     365<li>Ridiculiser Java</li> 
     366<li>Déprimer les développeurs Ruby</li> 
     367<li>Rendre les chefs de projet C# jaloux</li> 
     368<li>Augmenter le nombre d'adhérents à l'association</li> 
     369</ul> 
     370</div> 
     371<div class="slide" id="le-plan"> 
     372<h1>Le plan</h1> 
     373<ul class="simple"> 
     374<li><strong>Quelques définitions</strong> <img alt="smile" src="media/smile.png" /></li> 
     375<li><cite>Partie 1: le TDD avec Python</cite></li> 
     376<li><cite>Partie 2: le reST</cite> A ZAPPER</li> 
     377<li><cite>Part 3: les doctests</cite></li> 
     378<li><cite>Part 4: le DDD</cite></li> 
     379</ul> 
     380</div> 
     381<div class="slide" id="quelques-d-finitions"> 
     382<h1>Quelques définitions</h1> 
     383<p>Que veux dire le mot <strong>agile</strong> ?</p> 
    385384</div> 
    386385<div class="slide" id="id2"> 
    387 <h1>A few definitions</h1> 
    388 <p>Technical documentation that helps to understand how a codebase 
    389 works and how it can be used. This can be:</p> 
    390 <ul class="simple"> 
    391 <li>a document describing a package <a class="footnote-reference" href="#id5" id="id3" name="id3">[1]</a>, a module <a class="footnote-reference" href="#id5" id="id4" name="id4">[1]</a> or a 
    392 serie of package</li> 
    393 <li>a glossary</li> 
    394 <li>a tutorial</li> 
    395 <li>a recipe</li> 
    396 </ul> 
    397 <table class="docutils footnote" frame="void" id="id5" rules="none"> 
     386<h1>Quelques définitions</h1> 
     387<p>Tentative de définition appliqué au développement:</p> 
     388<p><strong>C'est une méthodologie de programmation qui permet de 
     389rester réactif aux fréquentes modifications d'une base 
     390de code</strong></p> 
     391<p>Viens de l'<cite>Agile Manifesto</cite> (<a class="reference" href="http://agilemanifesto.org/">http://agilemanifesto.org/</a> <a class="footnote-reference" href="#id4" id="id3" name="id3">[1]</a>)</p> 
     392<ul class="simple"> 
     393<li>créé par le GoF (Beck, etc.) et co</li> 
     394<li>XP est une méthode agile populaire</li> 
     395</ul> 
     396<table class="docutils footnote" frame="void" id="id4" rules="none"> 
    398397<colgroup><col class="label" /><col /></colgroup> 
    399398<tbody valign="top"> 
    400 <tr><td class="label"><a name="id5">[1]</a></td><td><em>(<a class="fn-backref" href="#id3">1</a>, <a class="fn-backref" href="#id4">2</a>)</em> Python folders and files</td></tr> 
     399<tr><td class="label"><a class="fn-backref" href="#id3" name="id4">[1]</a></td><td>Le site ressemble à celui d'une secte, mais c'est une bonne secte <img alt="wink" src="media/wink.png" /></td></tr> 
    401400</tbody> 
    402401</table> 
    403402</div> 
     403<div class="slide" id="id5"> 
     404<h1>Quelques définitions</h1> 
     405<p>Les principes agiles peuvent s'appliquer à tout processus répétitif:</p> 
     406<ul class="simple"> 
     407<li>coder (-&gt; TDD)</li> 
     408<li>faire de la documentation (-&gt;DDD)</li> 
     409<li>passer la tondeuse</li> 
     410<li>etc.</li> 
     411</ul> 
     412</div> 
    404413<div class="slide" id="id6"> 
    405 <h1>A few definitions</h1> 
    406 <p>What <strong>Agile</strong> means ?</p> 
     414<h1>Le plan</h1> 
     415<ul class="simple"> 
     416<li><cite>Quelques définitions</cite></li> 
     417<li><strong>Partie 1: le TDD avec Python</strong> <img alt="smile" src="media/smile.png" /></li> 
     418<li><cite>Partie 2: le reST</cite></li> 
     419<li><cite>Part 3: les doctests</cite></li> 
     420<li><cite>Part 4: le DDD</cite></li> 
     421</ul> 
     422</div> 
     423<div class="slide" id="partie-1"> 
     424<h1>Partie 1</h1> 
     425<p><strong>Le TDD avec Python</strong></p> 
     426<ul class="simple"> 
     427<li><strong>Les principes du TDD</strong></li> 
     428<li><cite>Comment écrire des tests</cite></li> 
     429</ul> 
     430</div> 
     431<div class="slide" id="les-principes-du-tdd"> 
     432<h1>Les principes du TDD</h1> 
     433<ul class="simple"> 
     434<li>Chaque fonction == un ou plusieurs cas d'utilisation</li> 
     435<li>Un cas d'utilisation == un test possible</li> 
     436</ul> 
    407437</div> 
    408438<div class="slide" id="id7"> 
    409 <h1>A few definitions</h1> 
    410 <p><strong>A lightweight process to stay reactive to frequent changes</strong></p> 
    411 <ul class="simple"> 
    412 <li>Comes from the Agile Manifesto<ul> 
    413 <li><a class="reference" href="http://agilemanifesto.org/">http://agilemanifesto.org/</a> <a class="footnote-reference" href="#id9" id="id8" name="id8">[2]</a></li> 
    414 <li>created by members of the GoF (Beck, etc.) and others</li> 
    415 <li>XP is one popular agile method</li> 
    416 </ul> 
    417 </li> 
    418 </ul> 
    419 <table class="docutils footnote" frame="void" id="id9" rules="none"> 
    420 <colgroup><col class="label" /><col /></colgroup> 
    421 <tbody valign="top"> 
    422 <tr><td class="label"><a class="fn-backref" href="#id8" name="id9">[2]</a></td><td>The website looks a bit like some sect site but it's a good sect</td></tr> 
    423 </tbody> 
    424 </table> 
    425 </div> 
    426 <div class="slide" id="id10"> 
    427 <h1>A few definitions</h1> 
    428 <p>Agile principles can be applied to any repeating process:</p> 
    429 <ul class="simple"> 
    430 <li>coding</li> 
    431 <li>documenting</li> 
    432 <li>lawn-mowing</li> 
    433 <li>etc.</li> 
    434 </ul> 
    435 </div> 
    436 <div class="slide" id="id11"> 
    437 <h1>The plan</h1> 
    438 <ul class="simple"> 
    439 <li><cite>A few definitions</cite></li> 
    440 <li><strong>Part 1: doing TDD in Python</strong></li> 
    441 <li><cite>Part 2: writing documents in reST</cite></li> 
    442 <li><cite>Part 3: writing doctests</cite></li> 
    443 <li><cite>Part 4: doing DDD in Python</cite></li> 
    444 </ul> 
    445 </div> 
    446 <div class="slide" id="part-1"> 
    447 <h1>Part 1</h1> 
    448 <p><strong>Doing TDD in Python</strong></p> 
    449 <p>This part is composed of:</p> 
    450 <ul class="simple"> 
    451 <li><strong>The TDD principles</strong></li> 
    452 <li><cite>How to write tests in Python</cite></li> 
    453 <li><cite>How to organise tests in a Python project</cite></li> 
    454 </ul> 
    455 </div> 
    456 <div class="slide" id="tdd-principles"> 
    457 <h1>TDD Principles</h1> 
    458 <ul class="simple"> 
    459 <li>Each function or method can have one or several sample use case</li> 
    460 <li>A sample use case == a test</li> 
    461 </ul> 
    462 </div> 
    463 <div class="slide" id="id12"> 
    464 <h1>TDD Principles</h1> 
    465 <p>Example:</p> 
     439<h1>Les principes du TDD</h1> 
     440<p>Exemple:</p> 
    466441<pre class="literal-block"> 
    467442&gt;&gt;&gt; def division(a, b): 
    468443...     return a / b 
    469444</pre> 
    470 <p>Let's test it !</p> 
     445<p>Essayons !</p> 
    471446<pre class="literal-block"> 
    472447&gt;&gt;&gt; def test_division(): 
     
    474449...         return 'OK' 
    475450...     else: 
    476 ...         return 'SHUT DOWN THE COMPUTER NOW !' 
     451...         return 'Le processeur est moisi' 
    477452&gt;&gt;&gt; test_division() 
    478453'OK' 
    479454</pre> 
    480455</div> 
    481 <div class="slide" id="id13"> 
    482 <h1>TDD Principles</h1> 
    483 <p>Each use case tests one aspect of the code</p> 
    484 <p>Let's try this one:</p> 
     456<div class="slide" id="id8"> 
     457<h1>Les principes du TDD</h1> 
     458<p>Chaque test concerne un aspect du code.</p> 
     459<p>En voici un autre:</p> 
    485460<pre class="literal-block"> 
    486461&gt;&gt;&gt; def test_division2(): 
     
    488463...         return 'OK' 
    489464...     else: 
    490 ...         return 'I WANT ZERO' 
     465...         return &quot;C'est discutable...&quot; 
    491466&gt;&gt;&gt; test_division2() 
    492467Traceback (most recent call last): 
     
    495470</pre> 
    496471</div> 
    497 <div class="slide" id="id14"> 
    498 <h1>TDD Principles</h1> 
    499 <p>The function fails, let's change it:</p> 
     472<div class="slide" id="id9"> 
     473<h1>Les principes du TDD</h1> 
     474<p>Ca plante, changeons la fonction:</p> 
    500475<pre class="literal-block"> 
    501476&gt;&gt;&gt; def division(a, b): 
     
    504479...     return a / b 
    505480</pre> 
    506 <p>and rerun the test:</p> 
     481<p>relancons le test:</p> 
    507482<pre class="literal-block"> 
    508483&gt;&gt;&gt; test_division2() 
     
    510485</pre> 
    511486</div> 
    512 <div class="slide" id="id15"> 
    513 <h1>TDD Principles</h1> 
    514 <ul class="simple"> 
    515 <li>The tests now validate several use cases for the function</li> 
    516 <li>Running all those tests == test suite</li> 
    517 <li>The function is now tighted to its test suite</li> 
    518 </ul> 
    519 </div> 
    520 <div class="slide" id="id16"> 
    521 <h1>TDD Principles</h1> 
    522 <p>Let's write the tests before the code:</p> 
     487<div class="slide" id="id10"> 
     488<h1>Les principes du TDD</h1> 
     489<ul class="simple"> 
     490<li>Plusieurs cas testés pour la fonction</li> 
     491<li>Lancer l'ensemble des tests == campagne de tests == <cite>test suite</cite></li> 
     492<li>La fonction est <cite>mariée</cite> à ses tests</li> 
     493</ul> 
     494<p><em>Je change la fonction, je revalide les tests</em></p> 
     495</div> 
     496<div class="slide" id="id11"> 
     497<h1>Les principes du TDD</h1> 
     498<p>Encore plus fort: le test est écrit <cite>avant</cite> le code:</p> 
    523499<pre class="literal-block"> 
    524500&gt;&gt;&gt; def test_average(): 
     
    533509</pre> 
    534510</div> 
    535 <div class="slide" id="id17"> 
    536 <h1>TDD Principles</h1> 
    537 <p>Now let's code <cite>average</cite>:</p> 
     511<div class="slide" id="id12"> 
     512<h1>Les principes du TDD</h1> 
     513<p>Le code à présent:</p> 
    538514<pre class="literal-block"> 
    539515&gt;&gt;&gt; def average(*args): 
    540516...     return sum(args) / len(args) 
    541517</pre> 
    542 <p>And run the test again:</p> 
     518<p>Le test à nouveau:</p> 
    543519<pre class="literal-block"> 
    544520&gt;&gt;&gt; test_average() 
    545521'OK' 
    546522</pre> 
    547 <ul class="simple"> 
    548 <li>Tests should be written <em>before</em> the code</li> 
    549 <li>In the real world they are written at the same time <img alt="wink" src="media/wink.png" /></li> 
     523<p>-&gt; Les tests devraient être écrits <em>avant</em> le code</p> 
     524<p>-&gt; Bien souvent ils le sont en même temps ou juste aprÚs</p> 
     525</div> 
     526<div class="slide" id="id13"> 
     527<h1>Les principes du TDD</h1> 
     528<p>Le TDD offre:</p> 
     529<ul class="simple"> 
     530<li>La <strong>Qualité</strong><ul> 
     531<li>les développeurs révisent naturellement leur code</li> 
     532<li>les refontes de code sont plus faciles</li> 
     533</ul> 
     534</li> 
     535<li>La <strong>non-régression</strong>: on relance les tests à chaque modification</li> 
     536<li><strong>Une documentation de base</strong>: lire les tests aide à comprendre le code</li> 
     537</ul> 
     538</div> 
     539<div class="slide" id="id14"> 
     540<h1>Les principes du TDD</h1> 
     541<p>Jean-Charles dit:</p> 
     542<blockquote> 
     543&quot;Les tests. Quelle perte de temps. C'est juste un jouet 
     544pour les langages interprétés&quot;</blockquote> 
     545<p>Bruce Eckel dit:</p> 
     546<blockquote> 
     547<em>&quot;If it's not tested, it's broken&quot;</em></blockquote> 
     548</div> 
     549<div class="slide" id="id15"> 
     550<h1>Les principes du TDD</h1> 
     551<p>Bruce a raison.</p> 
     552<ul class="simple"> 
     553<li>Le code non-testé est voué à mourir</li> 
     554<li>Toutes les mesures ont prouvé que l'on passe 
     555plus de temps à débugguer du code non-testé qu'à écrire 
     556les tests.</li> 
     557<li>Un compilateur valide la syntaxe, pas le fonctionnement.</li> 
     558</ul> 
     559</div> 
     560<div class="slide" id="id16"> 
     561<h1>Partie 1</h1> 
     562<p><strong>Le TDD avec Python</strong></p> 
     563<ul class="simple"> 
     564<li><cite>Les principes du TDD</cite></li> 
     565<li><strong>Comment écrire des tests</strong></li> 
     566</ul> 
     567</div> 
     568<div class="slide" id="comment-crire-des-tests"> 
     569<h1>Comment écrire des tests</h1> 
     570<p>Python est <em>batteries included</em>. On y trouve:</p> 
     571<ul class="simple"> 
     572<li><cite>unittest</cite>: un framework de test à la <strong>JUnit</strong></li> 
     573<li><cite>doctest</cite>: un outil de tests à la <strong>literate-programming-un-peu</strong></li> 
     574</ul> 
     575<p><img alt="important" src="media/important.png" /> Il existe plein d'autres outils tiers de tests</p> 
     576</div> 
     577<div class="slide" id="id17"> 
     578<h1>Comment écrire des tests</h1> 
     579<p><cite>unittest</cite> fourni des outils pour l'écriture des tests:</p> 
     580<ul class="simple"> 
     581<li>une classe <cite>TestCase</cite>, pour les assertions et les <cite>test fixture</cite>;</li> 
     582<li>une classe <cite>TestSuite</cite>, pour créér des séquences de tests;</li> 
     583<li>quelques fonctions pour lancer des <em>test campaign</em>.</li> 
    550584</ul> 
    551585</div> 
    552586<div class="slide" id="id18"> 
    553 <h1>TDD Principles</h1> 
    554 <p>TDD brings:</p> 
    555 <ul class="simple"> 
    556 <li><strong>Quality</strong><ul> 
    557 <li>the developers naturally review their code</li> 
    558 <li>refactoring is made easier</li> 
     587<h1>Comment écrire des tests</h1> 
     588<p><cite>TestCase</cite> fourni:</p> 
     589<ul class="simple"> 
     590<li>deux méthodes pour les <cite>test fixture</cite><ul> 
     591<li>setUp: au début du test</li> 
     592<li>tearDown: aprÚs le test</li> 
    559593</ul> 
    560594</li> 
    561 <li><strong>Non-regression</strong>: all tests are run on every change</li> 
    562 <li><strong>A primer documentation</strong>: reading tests helps understanding the code</li> 
    563 </ul> 
    564 </div> 
    565 <div class="slide" id="id19"> 
    566 <h1>TDD Principles</h1> 
    567 <p>Jean-Charles says:</p> 
    568 <blockquote> 
    569 &quot;Tests are a waste of time, just a toy for interpreted 
    570 languages&quot;</blockquote> 
    571 <p>Bruce Eckel says:</p> 
    572 <blockquote> 
    573 &quot;If it's not tested, it's broken&quot;</blockquote> 
    574 <p>Bruce's the one who's right:</p> 
    575 <ul class="simple"> 
    576 <li>untested code does not last long</li> 
    577 <li>all metrics have proven you waste way more time 
    578 debugging untested code than writing tests</li> 
    579 </ul> 
    580 </div> 
    581 <div class="slide" id="id20"> 
    582 <h1>Part 1</h1> 
    583 <p><strong>Doing TDD in Python</strong></p> 
    584 <ul class="simple"> 
    585 <li><cite>The TDD principles</cite></li> 
    586 <li><strong>How to write tests in Python</strong></li> 
    587 <li><cite>How to organise tests in a Python project</cite></li> 
    588 </ul> 
    589 </div> 
    590 <div class="slide" id="how-to-write-tests-in-python"> 
    591 <h1>How to write tests in Python</h1> 
    592 <p>Python is <em>battery included</em>. The standard library provides:</p> 
    593 <ul class="simple"> 
    594 <li><cite>unittest</cite>: a JUnit-like test framework</li> 
    595 <li><cite>doctest</cite>: a literate-programming-kind-of test tool</li> 
    596 </ul> 
    597 <p><img alt="important" src="media/important.png" /> There are many other test framework projects  out there</p> 
    598 </div> 
    599 <div class="slide" id="id21"> 
    600 <h1>How to write tests in Python</h1> 
    601 <p><cite>unittest</cite> provides helpers to write tests:</p> 
    602 <ul class="simple"> 
    603 <li>a <cite>TestCase</cite> class, that provides assertion methods and test fixture</li> 
    604 <li>a <cite>TestSuite</cite> class, to create a sequence of tests</li> 
    605 <li>a few functions to run a <em>test campaign</em></li> 
    606 </ul> 
    607 </div> 
    608 <div class="slide" id="id22"> 
    609 <h1>How to write tests in Python</h1> 
    610 <p><cite>TestCase</cite> provides two things:</p> 
    611 <ul class="simple"> 
    612 <li>two methods to manage the <cite>test fixture</cite><ul> 
    613 <li>setUp: runs when the test starts</li> 
    614 <li>tearDown: runs when the tests stops</li> 
    615 </ul> 
    616 </li> 
    617 <li>a serie of methods to make assertions:<ul> 
     595<li>des méhodes pour les assertions:<ul> 
    618596<li><tt class="docutils literal"><span class="pre">assert_</span></tt></li> 
    619597<li>assertEquals</li> 
     
    624602</ul> 
    625603</div> 
    626 <div class="slide" id="id23"> 
    627 <h1>How to write tests in Python</h1> 
    628 <p>Writing a test case == deriving from <cite>TestCase</cite>:</p> 
     604<div class="slide" id="id19"> 
     605<h1>Comment écrire des tests</h1> 
     606<p>Ecrire une suite de tests == dériver de <cite>TestCase</cite>:</p> 
    629607<pre class="literal-block"> 
    630608&gt;&gt;&gt; import unittest 
     
    638616... 
    639617</pre> 
    640 <p>Each test is a method with a <cite>test</cite> prefix.</p> 
    641 </div> 
    642 <div class="slide" id="id24"> 
    643 <h1>How to write tests in Python</h1> 
    644 <p>The test can be:</p> 
    645 <ul class="simple"> 
    646 <li>saved into a file (e.g. a module)</li> 
    647 <li>added to a <cite>test suite</cite> (e.g. a <cite>TestSuite</cite> class)</li> 
    648 <li>run with a default <cite>runner</cite> provided (e.g. the <cite>main</cite> function)</li> 
    649 </ul> 
    650 </div> 
    651 <div class="slide" id="id25"> 
    652 <h1>How to write tests in Python</h1> 
    653 <p>Example of test module:</p> 
     618<p>Un test == une méthode préfixée de <cite>test</cite></p> 
     619</div> 
     620<div class="slide" id="id20"> 
     621<h1>Comment écrire des tests</h1> 
     622<p>Les tests peuvent être:</p> 
     623<ul class="simple"> 
     624<li>sauvegardés dans des fichiers (e.g. un module)</li> 
     625<li>ajoutés à un <cite>test suite</cite> (e.g. une classe <cite>TestSuite</cite>)</li> 
     626<li>lancés par un <cite>runner</cite> fourni par défaut (e.g. la fonction <cite>main</cite>)</li> 
     627</ul> 
     628</div> 
     629<div class="slide" id="id21"> 
     630<h1>Comment écrire des tests</h1> 
     631<p>Exemple de module:</p> 
    654632<pre class="literal-block"> 
    655633import unittest 
     
    673651</pre> 
    674652</div> 
    675 <div class="slide" id="id26"> 
    676 <h1>How to write tests in Python</h1> 
    677 <p>Running the tests with the Python interpreter:</p> 
     653<div class="slide" id="id22"> 
     654<h1>Comment écrire des tests</h1> 
     655<p>Lancement des tests:</p> 
    678656<pre class="literal-block"> 
    679657dabox:~ tarek$ python test_division.py 
     
    685663</pre> 
    686664</div> 
    687 <div class="slide" id="id27"> 
    688 <h1>How to write tests in Python</h1> 
    689 <p>Running the tests with the Python interpreter, with a failure:</p> 
     665<div class="slide" id="id23"> 
     666<h1>Comment écrire des tests</h1> 
     667<p>Lancement des tests, avec une erreur:</p> 
    690668<pre class="literal-block"> 
    691669dabox:~ tarek$ python test_division.py 
     
    705683</pre> 
    706684</div> 
    707 <div class="slide" id="id28"> 
    708 <h1>How to write tests in Python</h1> 
     685<div class="slide" id="id24"> 
     686<h1>Comment écrire des tests</h1> 
    709687<div align="center" class="figure"> 
    710688<img alt="&quot;TDD with Python rocks&quot; -- Magnum" src="media/magnum.jpg" style="width: 400px; height: 300px;" /> 
     
    712690</div> 
    713691</div> 
     692<div class="slide" id="id25"> 
     693<h1>Partie 1</h1> 
     694<p>Pour aller plus loin:</p> 
     695<blockquote> 
     696-&gt; Comment organiser les tests dans un projet Python</blockquote> 
     697</div> 
     698<div class="slide" id="the-plan"> 
     699<h1>The plan</h1> 
     700<ul class="simple"> 
     701<li><cite>A few definitions</cite></li> 
     702<li><cite>Part 1: doing TDD in Python</cite></li> 
     703<li><strong>Part 2: writing documents in reST</strong></li> 
     704<li><cite>Part 3: writing doctests</cite></li> 
     705<li><cite>Part 4: doing DDD in Python</cite></li> 
     706</ul> 
     707</div> 
     708<div class="slide" id="part-2"> 
     709<h1>Part 2</h1> 
     710<p>Writing documents in reST</p> 
     711<ul class="simple"> 
     712<li><strong>What is reST ?</strong></li> 
     713<li><cite>reST syntax overview</cite></li> 
     714<li><cite>reST tools</cite></li> 
     715</ul> 
     716</div> 
     717<div class="slide" id="what-is-rest"> 
     718<h1>What is reST ?</h1> 
     719<p>reSTructuredText (say reSt to be hype) is:</p> 
     720<ul class="simple"> 
     721<li>a plaintext markup syntax and parser system</li> 
     722<li>easy to read as-is, yet powerful</li> 
     723<li>the Pythonistas laTeX</li> 
     724<li>see <a class="reference" href="http://docutils.sf.net">http://docutils.sf.net</a></li> 
     725</ul> 
     726</div> 
     727<div class="slide" id="id26"> 
     728<h1>What is reST ?</h1> 
     729<p>Example:</p> 
     730<pre class="literal-block"> 
     731================== 
     732I am the reST file 
     733================== 
     734 
     735I am the first section 
     736====================== 
     737 
     738I am the content of the first section. 
     739I have things to say. 
     740 
     741I am the second section 
     742======================= 
     743 
     744I am, what I am, what I aammmm... 
     745</pre> 
     746</div> 
     747<div class="slide" id="id27"> 
     748<h1>What is reST ?</h1> 
     749<p>Several remarks:</p> 
     750<ul class="simple"> 
     751<li>the reST syntax doesn't obfuscate the text</li> 
     752<li>punctuation signs are used to underline section titles</li> 
     753</ul> 
     754</div> 
     755<div class="slide" id="id28"> 
     756<h1>Part 2</h1> 
     757<p>Writing documents in reST</p> 
     758<ul class="simple"> 
     759<li><cite>What is reST ?</cite></li> 
     760<li><strong>reST syntax overview</strong></li> 
     761<li><cite>reST tools</cite></li> 
     762</ul> 
     763</div> 
     764<div class="slide" id="rest-syntax-overview"> 
     765<h1>reST syntax overview</h1> 
     766<ul class="simple"> 
     767<li>punctuation signs to underline sections</li> 
     768<li>text enhancements<ul> 
     769<li><tt class="docutils literal"><span class="pre">*emphasis*</span></tt></li> 
     770<li><tt class="docutils literal"><span class="pre">**strong</span> <span class="pre">emphasis**</span></tt></li> 
     771<li><tt class="docutils literal"><span class="pre">`interpreted</span> <span class="pre">text`</span></tt></li> 
     772<li><tt class="docutils literal"><span class="pre">``inline</span> <span class="pre">literal</span> <span class="pre">text``</span></tt></li> 
     773</ul> 
     774</li> 
     775</ul> 
     776</div> 
    714777<div class="slide" id="id29"> 
    715 <h1>Part 1</h1> 
    716 <p><strong>Doing TDD in Python</strong></p> 
    717 <ul class="simple"> 
    718 <li><cite>The TDD principles</cite></li> 
    719 <li><cite>How to write tests in Python</cite></li> 
    720 <li><strong>How to organise tests in a Python project</strong></li> 
     778<h1>reST syntax overview</h1> 
     779<ul class="simple"> 
     780<li>bullet list: use +, * or -</li> 
     781<li>enumerated list: use n. (1., 2., etc.) or #. (automatic)</li> 
     782</ul> 
     783</div> 
     784<div class="slide" id="id30"> 
     785<h1>Part 2</h1> 
     786<p>Writing documents in reST</p> 
     787<ul class="simple"> 
     788<li><cite>What is reST ?</cite></li> 
     789<li><cite>reST syntax overview</cite></li> 
     790<li><strong>reST tools</strong></li> 
     791</ul> 
     792</div> 
     793<div class="slide" id="rest-tools"> 
     794<h1>reST tools</h1> 
     795<p>XXX</p> 
     796</div> 
     797<div class="slide" id="id31"> 
     798<h1>Part 2</h1> 
     799<p>Writing documents in reST</p> 
     800<ul class="simple"> 
     801<li><cite>What is reST ?</cite></li> 
     802<li><cite>reST syntax overview</cite></li> 
     803<li><cite>reST tools</cite></li> 
     804</ul> 
     805<p>reST can be:</p> 
     806<ul class="simple"> 
     807<li>used for all documentation needs</li> 
     808<li>manipulated like code (versioning, etc.)</li> 
     809<li>easily transformed into various shapes</li> 
     810</ul> 
     811<p>Python developers <img alt="love" src="media/love.png" /> reST</p> 
     812</div> 
     813<div class="slide" id="id32"> 
     814<h1>The plan</h1> 
     815<ul class="simple"> 
     816<li><cite>A few definitions</cite></li> 
     817<li><cite>Part 1: doing TDD in Python</cite></li> 
     818<li><cite>Part 2: writing documents in reST</cite></li> 
     819<li><strong>Part 3: writing doctests</strong></li> 
     820<li><cite>Part 4: doing DDD in Python</cite></li> 
    721821</ul> 
    722822</div> 
     
    738838</ul> 
    739839</div> 
    740 <div class="slide" id="id30"> 
     840<div class="slide" id="id33"> 
    741841<h1>How to organise tests in a Python project</h1> 
    742842<p>Our division package will look like this:</p> 
     
    755855</pre> 
    756856</div> 
    757 <div class="slide" id="id31"> 
     857<div class="slide" id="part-1"> 
    758858<h1>Part 1</h1> 
    759859<p><cite>Doing TDD in Python</cite></p>