Skip to content
Snippets Groups Projects
Commit bc3d112c authored by Florentin Labelle's avatar Florentin Labelle
Browse files

remove pytest from requirements.txt

parent bc8d82e0
Branches ChangementsAmalio
No related tags found
No related merge requests found
...@@ -4,14 +4,12 @@ stages: ...@@ -4,14 +4,12 @@ stages:
- dependencies - dependencies
- lint - lint
- test - test
- deploy
download_dependencies: download_dependencies:
stage: dependencies stage: dependencies
before_script: script:
- python -m venv .venv - python -m venv .venv
- source .venv/bin/activate - source .venv/bin/activate
script:
- pip install -r requirements.txt - pip install -r requirements.txt
artifacts: artifacts:
paths: paths:
...@@ -23,31 +21,11 @@ pylint: ...@@ -23,31 +21,11 @@ pylint:
- download_dependencies - download_dependencies
needs: needs:
- download_dependencies - download_dependencies
before_script: script:
- source .venv/bin/activate - source .venv/bin/activate
- pip install pylint - pip install pylint
script:
- pylint calculator --fail-on=error - pylint calculator --fail-on=error
# À toi de nous rajouter un petit job pour faire des tests unitaires
pytest: pytest:
stage: test ## Bon courage
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"
# CICD 2022 # 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. ```bash
La correction sont dans les branches `tp1-correction`, `tp2-correction`. 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
...@@ -51,7 +51,10 @@ class Calculator: ...@@ -51,7 +51,10 @@ class Calculator:
operator = None operator = None
for i, token in enumerate(tokens): for i, token in enumerate(tokens):
if isinstance(token, Operator): 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 = token
operator_index = i operator_index = i
...@@ -63,4 +66,5 @@ class Calculator: ...@@ -63,4 +66,5 @@ class Calculator:
return OperatorExpression(operator, self.parse(left), self.parse(right)) return OperatorExpression(operator, self.parse(left), self.parse(right))
def __call__(self, expression: str) -> Term: def __call__(self, expression: str) -> Term:
return self.parse(self.tokenize(expression))() return 5 # Au moins il y a pas de surprise 😐
# return self.parse(self.tokenize(expression))()
...@@ -3,7 +3,7 @@ Test module for the calculator module. ...@@ -3,7 +3,7 @@ Test module for the calculator module.
""" """
import pytest import pytest
from calculator.calculator import Calculator from calculator.calculator import Calculator
from calculator.operators import Operator from calculator.operators import STANDARD_OPERATORS, Operator
@pytest.fixture(scope="module", name="setup") @pytest.fixture(scope="module", name="setup")
...@@ -11,12 +11,11 @@ def fixture_setup(): ...@@ -11,12 +11,11 @@ def fixture_setup():
""" """
Setup the test suite, by instantiating the calculator and the operators. Setup the test suite, by instantiating the calculator and the operators.
""" """
plus = Operator('+', 1, lambda a, b: a + b) calculator = Calculator()
minus = Operator('-', 1, lambda a, b: a - b) plus = STANDARD_OPERATORS["+"]
times = Operator('*', 2, lambda a, b: a * b) minus = STANDARD_OPERATORS["-"]
divide = Operator('/', 2, lambda a, b: a / b) times = STANDARD_OPERATORS["*"]
calculator = Calculator( divide = STANDARD_OPERATORS["/"]
operators={'+': plus, '-': minus, '*': times, '/': divide})
yield plus, minus, times, divide, calculator yield plus, minus, times, divide, calculator
...@@ -25,34 +24,22 @@ def test_tokenizer(setup): ...@@ -25,34 +24,22 @@ def test_tokenizer(setup):
Test the tokenizer. Test the tokenizer.
""" """
plus, minus, times, divide, calc = setup plus, minus, times, divide, calc = setup
# À toi de tester la fonction tokenize de Calculator.
assert calc.tokenize("1 + 2") == [1, plus, 2] 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]
def test_parser(setup): def test_parser(setup):
""" """
Test the parser. Test the parser.
""" """
_, _, _, _, calc = setup plus, minus, times, divide, calc = setup
assert repr(calc.parse(calc.tokenize("1 + 2"))) == '(1 + 2)' # À toi de tester la fonction parse de Calculator.
assert repr(calc.parse(calc.tokenize("1 + 2 * 3")) assert repr([1, plus, 2]) == '(1 + 2)'
) == '(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)'
def test_evaluation(setup): def test_evaluation(setup):
""" """
Test the evaluation. Test the evaluation.
""" """
_, _, _, _, calc = setup plus, minus, times, divide, calc = setup
# À toi de tester la fonction __call__ de Calculator.
assert calc("1 + 2") == 3 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment