TDD et Python

par Vincent Poulailleau - 3 minutes de lecture - 510 mots

TDD, Java, Python

Python, c’est mieux que Java, non ?

En vrai, ce qui compte c’est qu’une entreprise soit efficace. Libre à elle de choisir ce qu’elle pense être le mieux.

Mais j’ai mon avis sur la question 😉 Et là n’est pas l’objet de ce post, que j’ai écrit après avoir visionné https://m.youtube.com/watch?v=yiCpfd-kz3g

C’est une vidéo où Michaël Azerhad essaie de nous montrer comment il est possible de coder plus rapidement avec TDD. Ou plutôt, nous arrivons à un code final sans bug, et surtout sans passer des heures à débugger.

Suite de Conway

Il prend l’exemple du codage de la suite de Conway, expliquée par Wikipédia ici : https://fr.wikipedia.org/wiki/Suite_de_Conway

Michaël se filme en train de coder, et en 30 minutes il en vient à bout (tout en expliquant en simultané ce qu’il fait à l’oral, chapeau bas !).

Voyant le code, cela m’a intrigué, et j’ai voulu essayer en Python, en faisant un mélange TDD / test first. Créer un environnement virtuel, installer pytest, écrire les tests et le code m’a pris au total 7 minutes en prenant le temps. Le fait de bien connaître le langage Python m’a fait aller vite, car j’ai su exploiter un des outils de la bibliothèque standard (itertools.groupby) qui semblait tout indiqué après avoir découvert la fameuse suite de Conway.

On arrive au final à un code de 400 caractères en Python et 2600 en Java (je ne me considère pas du tout pro de Java, j’ai donc recopié le code de la vidéo). Je n’ai pas oublié la fameuse PEP 20 de Python qui nous incite à faire du code lisible et simple, c’est pourquoi je n’ai pas cherché à minimiser le nombre de caractères de mon programme. Je pense que le code que j’ai fourni est améliorable, mais je voulais voir comment s’en sortir rapidement.

Et vous, vous en pensez quoi de la verbosité de Java par rapport à Python ? Quid de l’impact de cette verbosité sur la documentation, l’écriture des tests, la maintenabilité ?

(Rassurez-vous, je sais aussi taper beaucoup de caractères, c’est pour cela que j’utilise un clavier BÉPO depuis de nombreuses années…)

Voici mes tests Python pour ceux que ça tente d’essayer :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import pytest

from conway import conway_next_line, conway


@pytest.mark.parametrize(
    "line,result",
    [
        ("1", "1 1"),
        ("2", "1 2"),
        ("2 2", "2 2"),
        ("2 1", "1 2 1 1"),
        ("2 1 3", "1 2 1 1 1 3"),
        ("2 1 1 1", "1 2 3 1"),
        ("2 3 3 1", "1 2 2 3 1 1"),
    ],
)
def test_conway_next_line(line: str, result: str):
    assert conway_next_line(line) == result


@pytest.mark.parametrize(
    "start,depth,result",
    [
        ("1", 2, "1\n1 1"),
        ("1", 3, "1\n1 1\n2 1"),
        ("1", 4, "1\n1 1\n2 1\n1 2 1 1"),
        ("1", 5, "1\n1 1\n2 1\n1 2 1 1\n1 1 1 2 2 1"),
    ],
)
def test_conway(start: str, depth: int, result: str):
    assert conway(start, depth) == result