From b168ab368a1bbe9fa630d89f329170e28d2ab8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Derrode?= <stephane.derrode@ec-lyon.fr> Date: Thu, 24 Sep 2020 12:03:05 +0200 Subject: [PATCH] MAJ sujet BE #2 --- seance2_4h/figures/spyder-tests.png | Bin 41286 -> 0 bytes seance2_4h/figures/spyder-unittest.png | Bin 4633 -> 0 bytes seance2_4h/seance2_4h.md | 134 ++++++++++++++++--------- 3 files changed, 89 insertions(+), 45 deletions(-) delete mode 100644 seance2_4h/figures/spyder-tests.png delete mode 100644 seance2_4h/figures/spyder-unittest.png diff --git a/seance2_4h/figures/spyder-tests.png b/seance2_4h/figures/spyder-tests.png deleted file mode 100644 index 6e0b0be2309ee3d7d989d878f04856c8b0ae2487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41286 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 diff --git a/seance2_4h/figures/spyder-unittest.png b/seance2_4h/figures/spyder-unittest.png deleted file mode 100644 index e8760f1d8ee314fb4668179a565949dce8ed95ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4633 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 diff --git a/seance2_4h/seance2_4h.md b/seance2_4h/seance2_4h.md index f028023..b998a3e 100644 --- a/seance2_4h/seance2_4h.md +++ b/seance2_4h/seance2_4h.md @@ -5,9 +5,9 @@ # TD2 : Modélisation de formes géométriques -Nous allons aborder dans ce TD le concept d'héritage de la programmation objet, et l'utilisation de tests unitaires pour guider le développement logiciel et améliorer sa qualité. +Nous allons aborder dans ce TD le concept d'héritage de la programmation objet, et l'utilisation de tests unitaires pour améliorer la qualité du logiciel. -Le but de ce TD est de concevoir un module pour manipuler des formes géométriques avec Python. Ce module sera utilisé dans les TDs suivants, donc les tests seront essentiels pour limiter les éventuels bugs. Vous commencerez par définir les classes et leurs attributs, puis par écrire les tests unitaires de votre module, et terminerez par l'implémentation des méthodes. +Le but de ce TD est de concevoir un module pour manipuler des formes géométriques avec Python. Ce module sera utilisé dans les TDs suivants, donc les tests seront essentiels pour limiter les éventuels bugs. Vous commencerez par définir les classes et leurs attributs, puis implémenterez les méthodes, et les validerez avec des tests. ## Modélisation avec UML (1h) @@ -40,73 +40,117 @@ __Exercice 3 -__ Complétez le diagramme UML avec ces méthodes. Les constructeu __Exercice 4 -__ Écrivez un squelette de code correspondant à votre diagramme UML, dans un fichier _formes.py_. Seuls les constructeurs devront être implémentés. À l'intérieur des autres méthodes, vous mettrez l'instruction `pass` de Python (qui ne fait rien mais vous rappelle que le code est inachevé). -## Tests unitaires (1h) - -Il convient à présent de rédiger des tests, qui échoueront tant que chaque fonction ne sera pas implémentée et correcte. Dans la méthodologie _Test Driven Development_, on les écrit toujours avant le code, au début ils échouent tous, et à mesure de l'avancement du projet le nombre de tests passés avec succès augmente. Nous utiliserons le module _pytest_ présenté en cours. +## Implémentation des méthodes (2h) -### Installation de _pytest_ +Créez un fichier _test_formes.py_ dans le même dossier que _formes.py_ et initialisé avec le code suivant : -Nous allons d'abord installer _pytest_, ainsi qu'un module permettant de lancer les tests depuis l'interface de Spyder. Ouvrez le terminal d'Anaconda (sous Windows, Menu Démarrer -> Anaconda -> Anaconda Prompt, sous Linux/Mac le terminal de base suffit). Exécutez-y la commande suivante : +```python +from formes import * -```sh -conda install -c spyder-ide spyder-unittest pytest +def test_Rectangle(): + r = Rectangle(10, 20, 100, 50) + str(r) + assert r.contient_point(50, 50) + assert not r.contient_point(0, 0) + r.redimension_par_points(100, 200, 1100, 700) + assert r.contient_point(500, 500) + assert not r.contient_point(50, 50) + +def test_Ellipse(): + e = Ellipse(60, 45, 50, 25) + str(e) + assert e.contient_point(50, 50) + assert not e.contient_point(11, 21) + e.redimension_par_points(100, 200, 1100, 700) + assert e.contient_point(500, 500) + assert not e.contient_point(101, 201) + +if __name__ == '__main__': + test_Rectangle() + test_Ellipse() ``` -❗ Si vous rencontrez une erreur comme `conda: command not found`, c'est que l'exécutable `conda` n'est présent dans aucun des dossiers visités par le terminal (essayez `echo %PATH%` pour en afficher la liste sous Windows, et `echo $PATH` sous Linux/Mac). Sous Windows, vérifiez que vous ouvrez bien le terminal d'Anaconda (pas le terminal par défaut du système). Sous Linux/Mac, la commande `export PATH=~/anaconda3/bin:/usr/local/anaconda3/bin:/usr/anaconda3/bin:$PATH` va ajouter (temporairement) une liste de répertoires usuels à la liste de recherche. +La commande `assert` de Python permet de spécifier une assertion (une condition qui doit toujours être vraie) à un point du programme. Elle sert avant un bloc de code à en documenter les prérequis, et après un bloc de code à en vérifier les résultats. Son échec signifie alors un bug du programme. `assert` reçoit une expression (comme ce qu'on passe à `if`), et vérifie son résultat : -Une fois les modules installés, __redémarrez Spyder__ et créez un fichier _test_formes.py_ avec l'exemple de code suivant : +* Si `True`, l'assertion est vraie donc pas de problème, `assert` ne fait rien. +* Si `False`, l'assertion est fausse donc une exception `AssertionError` est déclenchée. +* Si l'expression renvoie une autre valeur, celle-ci est convertie en booléen pour se ramener aux deux cas précédents. -```python -from formes import * +La vérification de cette condition est faite une fois au moment de son exécution (l'assertion ne sera pas valide dans le reste du programme). Dans _test_formes.py_ on utilise `assert` pour tester une fonctionnalité qui n'est pas encore implémentée, l'exécution de ce fichier échouera tant que les méthodes de seront pas codées. À l'issue de cette partie, elle ne devra renvoyer aucune erreur ! + +__Exercice 5 -__ Implémentez les méthodes d'affichage (`__str__`) de chacune des classes dans _formes.py_. Vous pourrez vérifier leur bon fonctionnement en exécutant _formes.py_ (bouton Run File - F5), puis par exemple avec une commande `print(Rectangle(0, 0, 10, 10))` dans la console IPython. -def test_heritage(): - assert issubclass(Rectangle, Forme) - assert issubclass(Ellipse, Forme) +__Exercice 6 -__ Implémentez les méthodes d'accès getter/setter pour les champs privés de chacune des classes. Pour vérifier que les champs sont bien privés, le code suivant __doit__ échouer avec une erreur `AttributeError` : + +```python +r = Rectangle(0, 0, 10, 10) +print(r.__l, r.__h) ``` -__Exécutez ce fichier__ dans Spyder (même s'il ne fait rien), ce qui a pour effet d'initialiser le répertoire courant de Spyder à votre répertoire de travail. Allez ensuite dans le menu Run -> Run unit tests, pour configurer le module _spyder-unittest_. +__Exercice 7 -__ Implémentez les méthodes `contient_point` des trois sous-classes. Vous vérifierez que les deux premiers `assert` des méthodes de test ne déclenchent pas d'erreur. -<center><img src="figures/spyder-unittest.png" style="width:100%"/></center> +__Exercice 8 -__ Implémentez les méthodes `redimension_par_points` de chacune des sous-classes. Le fichier _test_formes.py_ doit à présent s'exécuter sans problème. +## Tests unitaires (1h) -Sélectionnez _pytest_, vérifiez que le dossier indiqué correspond à votre dossier de travail (celui contenant les fichiers _formes.py_ et _test_formes.py_), et validez. Un nouvel onglet _Unit testing_ apparaît dans l'espace en haut à droite, avec un bouton _Run tests_. Lorsque vous cliquez dessus : +Une fois développées, vos classes vont être utilisées pour des besoins que vous n'aviez pas forcément anticipés. Certains vont révéler des bugs, et vos classes seront amenées à évoluer, y compris pour acquérir de nouvelles méthodes. Les tests unitaires servent à documenter les cas d'utilisation supportés, et également à vous assurer qu'une modification de votre code n'a pas introduit un bug (une _régression_). -* _pytest_ cherche (dans le dossier que vous venez de configurer) tous les fichiers de la forme _test\_\*.py_ et _\*\_test.py_. -* Dans chacun de ces fichiers, _pytest_ exécute toutes les fonctions préfixées par `test`. -* Chaque test qui s'exécute sans déclencher d'exception est considéré valide. -* La fonction `test_heritage` dans le fichier _test_formes.py_ correspond à ces critères, donc elle est exécutée et son résultat contribue à un test "passé" (avec succès). +On vous fournit une méthode de test plus exhaustive pour __Rectangle__ : -<center><img src="figures/spyder-tests.png" style="width:100%"/></center> +```python +def test_Rectangle(): + r = Rectangle(-20, -10, 40, 20) + assert r.contient_point(0, 0) + assert r.contient_point(-20, 0) + assert r.contient_point(0, -10) + assert r.contient_point(20, 0) + assert r.contient_point(0, 10) + assert not r.contient_point(-40, 0) + assert not r.contient_point(0, -20) + assert not r.contient_point(40, 0) + assert not r.contient_point(0, 20) + assert not r.contient_point(-40, -20) + assert not r.contient_point(40, -20) + assert not r.contient_point(40, 20) + assert not r.contient_point(-40, 20) + reference = str(r) + r.redimension_par_points(-20, 10, 20, -10) + assert str(r) == reference + r.redimension_par_points(20, 10, -20, -10) + assert str(r) == reference + r.redimension_par_points(20, -10, -20, 10) + assert str(r) == reference + r.redimension_par_points(-20, -10, 20, 10) + assert str(r) == reference +``` -### Définition des tests +__Exercice 9 -__ Exécutez ce test sur votre code, et corrigez les éventuels bugs. Représentez ensuite dans un logiciel de dessin (ex. https://app.diagrams.net/) le rectangle et les positions des points qui sont testés. Quels bugs sont visés par chacun de ces tests ? -__Exercice 5 -__ Dans le fichier _test_formes.py_, ajoutez une fonction `test_Rectangle_contient_point()` qui instancie un __Rectangle__ avec des coordonnées de votre choix, et vérifie avec `assert` que la méthode `contient_point` renvoie le bon résultat pour différentes coordonnées. L'exécution du test doit échouer puisque votre code est encore vide. +La rédaction de tests unitaires consiste souvent à anticiper les bugs courants, pour améliorer la qualité du logiciel dès sa conception. On cherche donc délibérément à provoquer des situations difficiles à gérer (ex. points _sur_ le bord du rectangle). De telles situations sont par exemple : -Pour l'exercice suivant, on vous donne un exemple d'implémentation de la méthode `contient_point` pour la classe __Rectangle__. La classe __Forme__ a été omise pour réduire la taille du code (mais dans votre fichier elle devra bien être présente). +* le choix de `<` ou `<=` dans le code +* le traitement de valeurs négatives +* les erreurs d'arrondis dans les opérations avec `float` +* la gestion de valeurs nulles (ex. largeur ou hauteur) -```python -class Rectangle: - def __init__(self, x, y, l, h): - self.x = x - self.y = y - self.__l = l - self.__h = h - - def contient_point(self, x, y): - return self.x < x < self.__l or \ - self.y < y < self.__h -``` +__Exercice 10 -__ Dessinez une ellipse dans votre logiciel de dessin, et représentez tous les points qu'il convient de tester avec `contient_point`. Pour chaque point (ou groupe de points), indiquez le type de bug qu'il vise en particulier. Implémentez ces tests dans _test_formes.py_. -__Exercice 6 -__ Cette méthode est buggée. Comment la corriger ? Vos tests l'avaient-ils repéré ? Si ce n'est pas le cas, trouvez les coordonnées qui donnent un mauvais résultat et ajoutez-les en tests dans la fonction `test_Rectangle_contient_point`. +__Exercice 11 -__ Dessinez une forme issue de votre troisième classe dans le logiciel de dessin, et choisissez les points qu'il faudra tester. Implémentez une nouvelle méthode de tests pour cette classe dans _test_formes.py_. -## Implémentation des méthodes (2h) +## Pour aller plus loin + +Lorsque votre programme utilise un grand nombre de tests unitaires, il est possible d'automatiser leur collecte, leur exécution, et l'affichage d'un rapport synthétique. On utilisera alors le module [_pytest_](https://docs.pytest.org/en/stable/) pour Python. + +❗ Son installation nécessite que vous ayez installé Anaconda pour l'utilisateur de la machine, et non global au système. Il suffit alors d'ouvrir un terminal d'Anaconda (sous Windows, Menu Démarrer -> Anaconda -> Anaconda Prompt, sous Linux/Mac le terminal de base suffit), et d'y lancer la commande suivante : -__Exercice 7 -__ Implémentez les méthodes d'affichage (`__str__`) de chacune des classes. Il ne sera pas nécessaire d'écrire des tests pour ces méthodes. +```sh +conda install pytest +``` -__Exercice 8 -__ Implémentez les méthodes d'accès getter/setter pour les champs privés de chacune des classes. À l'aide de [pytest.raises](https://docs.pytest.org/en/stable/assert.html#assertions-about-expected-exceptions), vous testerez le déclenchement d'erreurs si on essaie d'accéder directement aux attributs. +Si vous rencontrez une erreur comme `conda: command not found`, c'est que l'exécutable `conda` n'est présent dans aucun des dossiers visités par le terminal (essayez `echo %PATH%` pour en afficher la liste sous Windows, et `echo $PATH` sous Linux/Mac). Sous Windows, vérifiez que vous ouvrez bien le terminal d'Anaconda (pas le terminal par défaut du système). Sous Linux/Mac, la commande `export PATH=~/anaconda3/bin:/usr/local/anaconda3/bin:/usr/anaconda3/bin:$PATH` va ajouter (temporairement) une liste de répertoires usuels à la liste de recherche. -__Exercice 9 -__ Implémentez les méthodes `contient_point` des deux sous-classes restantes. Vous fournirez pour chacune une fonction de tests avec des jeux de coordonnées pertinents. +__Exercice 12 -__ Vérifiez que _pytest_ est installé en exécutant la commande `import pytest` qui ne doit pas renvoyer d'erreur. Ensuite exécutez la commande `pytest.main()`. Combien de fichiers ont été "collectés" ? Combien de tests ont réussi ? Combien ont échoué ? -__Exercice 10 -__ Implémentez les méthodes `redimension_par_points` de chacune des sous-classes. Vous fournirez également des tests validant leur fonctionnement quels que soient les points en entrée. +__Exercice 13 -__ [pytest.raises](https://docs.pytest.org/en/stable/assert.html#assertions-about-expected-exceptions) permet de vérifier qu'un bloc de code déclenche une exception (`raises` ne fait rien si le code échoue, et échoue si le code ne déclenche pas d'exception). Lisez les exemples de la documentation et ajoutez des tests pour vérifier que les variables privées sont inaccessibles de l'extérieur de chaque classe. -- GitLab