Un projet avec des tests

Vous aller coder ici une méthode de chiffrement/déchiffrement de texte : le code de césar.

Le projet

Du point de vue de python un projet est un dossier qui va contenir les différents fichiers python. Appelons le chiffre_cesar.

À retenir

Dans la mesure du possible, le nom des dossiers et des fichiers d'un projet informatiques :

  • ne doivent contenir que des lettres non accentuées
  • ne doivent contenir pas contenir d'espaces. On sépare les mots par des underscore _

Le programme principal

Le programme principal est le fichier que l'on va exécuter, on a coutume de l'appeler main.py

À retenir

Un projet informatique va contenir de nombreux fichiers, mais un seul sera le programme principal, celui que l'on exécutera avec la commande python main.py.

Dans notre cas, notre programme est :

fichier main.py :

import texte
from chiffre import césar_chiffre, césar_déchiffre

entrée = input("Tapez une chaîne de caractères en français : ")
texte = texte.conversion(entrée)


clé = input("Tapez une lettre de l'alphabet (clé de chiffrement) : ")
chiffre = césar_chiffre(texte, clé)
déchiffre = césar_déchiffre(chiffre, clé)

print("Texte initial   :", texte)
print("Texte chiffré   :", chiffre)
print("Texte déchiffré :", déchiffre)

On voit que ce fichier demande des choses à un utilisateur et utilise deux importations (texte et chiffre) qui correspondent à nos fichiers de fonctions.

Pour exécuter le fichier, on utilise le terminal dans le dossier du projet. Ci-après une exécution possible :

$> python main.py
Tapez une chaîne de caractères en français : Éléonore m'adore !           
Tapez une lettre de l'alphabet (clé de chiffrement) : F
Texte initial   : ELEONORE M'ADORE !
Texte chiffré   : JQJTSTWJ R'FITWJ !
Texte déchiffré : ELEONORE M'ADORE !

Fichiers de fonctions

Là c'est à vous de travailler. On va séparer les fonctions du projet en 2 fichiers :

Prenez l'habitude de tester intensivement vos fonctions avec le terminal. C'est facile à faire en utilisant des raccourci clavier :

  1. ouvrez un terminal dans vscode avec son raccourci clavier (il est visible dans le menu affichage > terminal ou via le les préférences raccourci en tapant "afficher terminal".).
  2. exécutez la commande python -m pytest. Une fois que vous l'aurez exécuté si vous tapez la flèche du haut dans un terminal vous allez reprendre la dernière commande tapée
  3. fermer le terminal pour revenir à votre fenètre de code en utilisant le même raccourci qu'en 1.

La manipulation précédente va très vite !

  1. le raccourci clavier pour afficher le terminal
  2. la flèche du haut dans le terminal
  3. le raccourci clavier pour afficher le terminal

Fonctions chiffre

Créez un fichier chiffre.py et son pendant test_chiffre.py qui chiffre et déchiffre un texte écrit en majuscule non accentuée. Il doit contenir 2 fonctions :

  • césar_chiffre(texte_clair, cle) avec :
    • texte_clair une chaine de caractère en majuscule
    • clé un caractère en majuscule
    • la fonction doit retourner le chiffre de César de texte selon la clé
  • césar_déchiffre(texte_chiffré, cle) avec :
    • texte_chiffré une chaine de caractère en majuscule
    • clé un caractère en majuscule
    • la fonction doit retourner le déchiffrement de César de texte selon la clé

Vous pourrez utiliser judicieusement (rappelez vous des différentes méthodes des chaines de caractère) la chaine ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" dans vos fonctions

Fonctions texte

Le fichier texte.py ne va contenir qu'une seule fonction, qui va transformer toute chaîne de caractère en une chaîne en majuscule non accentuée. Par exemple :

import unicodedata


def conversion(texte_avec_accent):
    liste_glyphes_unicode = list(unicodedata.normalize("NFKD", texte_avec_accent))

    liste_caractères = []
    for c in liste_glyphes_unicode:
        if not unicodedata.combining(c):
            liste_caractères.append(c)
    
    chaîne_sans_accent = "".join(liste_caractères)
    texte_en_majuscule = chaîne_sans_accent.upper()

    return texte_en_majuscule

Créez un fichier texte.py contenant la fonction ci-dessus. Créez le fichier test_conversion.py testant que cette fonction fait bien ce qu'elle est sensée faire.

À retenir

Sachez refaire la fonction de conversion. Elle est parfois très utile.

Ce que l'on teste est dépendant de chaque développeur : si les tests passent il doit être convaincu que son code est fonctionnel.

À retenir

C'est au développeur des fonctions de créer des tests pour elles de tel sorte que s'ils passent il soit persuadé que son code est sans bug (si un bug est découvert plus tard, il suffit de rajouter un test qui le montre puis corriger le code).

Corrigé

Les différents fichiers sont disponible ici