diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 64cbc557844bfdc8ce3716a56605bc9d3261fee4..faa48b7ee9fbb0a376a4b24abfcfddc86b77c05e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,25 +29,6 @@ pylint: script: - pylint calculator --fail-on=error +# À toi de nous rajouter un petit job pour faire des tests unitaires pytest: - stage: test - dependencies: - - download_dependencies - needs: - - download_dependencies - before_script: - - source .venv/bin/activate - script: - - pytest calculator - -# deploy: -# stage: deploy -# needs: -# - pylint -# - pytest -# before_script: -# - apt-get update -# - apt-get install -y openssh-client sshpass -# script: -# - sshpass -p viazero ssh -o StrictHostKeyChecking=no viazero@<ip-de-ma-vm> -# "cd /var/www/cicd && git pull && sudo systemctl restart calculator" + ## Bon courage diff --git a/README.md b/README.md index 18b65f4ebaad091c75a86366f685da62f73f6ab6..5424f8835f110bbd31c436a8e4520b9ed27a4c4e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,30 @@ # CICD 2022 -Bienvenue à cette fabuleuse formation. +## TP2 le testing -Je t'invite à forker le repo et à cloner ton fork sur ta machine. +Plus qu'avoir un jolie code, c'est bien aussi d'avoir un code qui fait ce qu'on veut. Pour cela, il faut tester son code. C'est ce que nous allons voir dans ce TP. -## Le sujet du tp +L'outil qu'on utilise c'est `pytest`. Il est très simple d'utilisation et permet de faire des tests. -Le sujet du tp est de proprifier et tester le code d'une calculatrice en ligne. Une simple page web où on peut entrer une expression mathématique et qui nous donne le résultat. +### Installation -## Pour commencer les tps +Pour installer `pytest`, il suffit de faire: -Les branches `tp1`, `tp2`, `tp3` contiennent les fichiers de base pour chaque tp. -La correction sont dans les branches `tp1-correction`, `tp2-correction`. +```bash +pip install pytest +``` + +### Utilisation + +```bash +pytest calculator +``` + +### Exercice + +- Ecrire des tests dans le fichier `test_calculator.py`. (4 tests cases par fonction (prendre des cas subtiles et des cas simples)) +- Créer un job de CI/CD qui va tester le code de la calculatrice avec `pytest` +- La CI/CD ne va pas marcher car il y a deux erreurs dans le code ( et oui, ce serait trop simple). Trouver l'erreur et la corriger. +- Faire un commit avec le message `fix: fix the calculator` +- Faire un push +- Vérifier que la CI/CD passe diff --git a/calculator/calculator.py b/calculator/calculator.py index a546fb898472a8fd7a8242915ecf341d879bfd4f..fd7087805b8c84cf2bf236b2467b40b7067dfe47 100644 --- a/calculator/calculator.py +++ b/calculator/calculator.py @@ -51,7 +51,10 @@ class Calculator: operator = None for i, token in enumerate(tokens): if isinstance(token, Operator): - if operator is None or token.precedence <= operator.precedence: + ##################################################################### + ### ATTENTION: Est-ce que c'est vraiment un < (non c'est un <=) ? ### + ##################################################################### + if operator is None or token.precedence < operator.precedence: operator = token operator_index = i diff --git a/calculator/operators.py b/calculator/operators.py index 8da0d85ed561f26108755cd1b3709280f3cee336..5a48950224b9194e4e5f42e3f1dca4a71c6bf132 100644 --- a/calculator/operators.py +++ b/calculator/operators.py @@ -22,5 +22,5 @@ STANDARD_OPERATORS = { '+': Operator('+', 1, lambda a, b: a + b), '-': Operator('-', 1, lambda a, b: a - b), '*': Operator('×', 2, lambda a, b: a * b), - '/': Operator('/', 2, lambda a, b: a / b), + '/': Operator('/', 2, lambda a, b: a % b), } diff --git a/calculator/test_calculator.py b/calculator/test_calculator.py index a7a07e2fd96657b51df6b87b0ca86bc3e218bf36..03a63c3e5153f50bc4238e13d9cde8681cb4bd68 100644 --- a/calculator/test_calculator.py +++ b/calculator/test_calculator.py @@ -25,34 +25,20 @@ def test_tokenizer(setup): Test the tokenizer. """ plus, minus, times, divide, calc = setup - assert calc.tokenize("1 + 2") == [1, plus, 2] - assert calc.tokenize("1 + 2 * 3") == [1, plus, 2, times, 3] - assert calc.tokenize( - "1 + 2 * 3 / 4") == [1, plus, 2, times, 3, divide, 4] - assert calc.tokenize( - "1 + 2 * 3 / 4 - 5") == [1, plus, 2, times, 3, divide, 4, minus, 5] + # À toi de tester la fonction tokenize de Calculator. def test_parser(setup): """ Test the parser. """ - _, _, _, _, calc = setup - assert repr(calc.parse(calc.tokenize("1 + 2"))) == '(1 + 2)' - assert repr(calc.parse(calc.tokenize("1 + 2 * 3")) - ) == '(1 + (2 * 3))' - assert repr(calc.parse(calc.tokenize( - "1 + 2 * 3 / 4"))) == '(1 + ((2 * 3) / 4))' - assert repr(calc.parse(calc.tokenize( - "1 + 2 * 3 / 4 - 5"))) == '((1 + ((2 * 3) / 4)) - 5)' + plus, minus, times, divide, calc = setup + # À toi de tester la fonction parse de Calculator. def test_evaluation(setup): """ Test the evaluation. """ - _, _, _, _, calc = setup - assert calc("1 + 2") == 3 - assert calc("1 + 2 * 3") == 7 - assert calc("1 + 2 * 3 / 4") == 2.5 - assert calc("1 + 2 * 3 / 4 - 5") == -2.5 + plus, minus, times, divide, calc = setup + # À toi de tester la fonction __call__ de Calculator.