Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Parametrizzazione dei Test in Pytest: Esecuzione dei Test con Input Multipli | Padronanza del Framework Pytest
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Programmazione Strutturale in Python

bookParametrizzazione dei Test in Pytest: Esecuzione dei Test con Input Multipli

Il testing parametrizzato è fondamentale per migliorare la copertura dei test senza dover scrivere numerose funzioni di test per scenari che differiscono solo per i loro input e output attesi. Questo approccio non solo consente di risparmiare tempo, ma aumenta anche la chiarezza e la manutenibilità delle suite di test grazie a:

  • Riduzione della duplicazione del codice e del potenziale di errori nel codice di test;
  • Possibilità di aggiungere facilmente nuovi casi di test semplicemente aggiungendo parametri;
  • Facilitazione di test completi su un'ampia gamma di input.

Consideriamo una semplice funzione che calcola la media di due numeri. Può verificarsi un errore logico se si dimenticano le parentesi. Utilizzeremo @pytest.mark.parametrize per testare questa funzione con diverse coppie di numeri.

# Function to test
def calculate_average(num1, num2):
    return (num1 + num2) / 2

# Test function using pytest's parametrize
import pytest

@pytest.mark.parametrize(
    "num1, num2, expected",
    [
        (10, 20, 15),
        (20, 30, 25),
        (5, 5, 5)
    ])
def test_calculate_average(num1, num2, expected):
    assert (calculate_average(num1, num2) == expected), f"Average of {num1} and {num2} should be equal to {(num1 + num2) / 2}"

Questo esempio mostra come eseguire test_calculate_average con tre diversi set di numeri, verificando se la funzione calcola correttamente la loro media.

Sintassi con id

Il parametro id viene utilizzato per assegnare un identificatore a ciascun set di input, facilitando l'identificazione dei test nell'output:

 @pytest.mark.parametrize("num1, num2, expected", [
    pytest.param(10, 20, 15, id="integers"),
    pytest.param(20, 30, 25, id="more integers"),
    pytest.param(5, 5, 5, id="equal numbers")
])
def test_calculate_average_with_ids(num1, num2, expected):
    assert calculate_average(num1, num2) == expected

L'utilizzo di pytest.param consente un controllo più granulare su ciascun caso di test, inclusa l'impostazione diretta degli ID individuali.

Sintassi con ids

È anche possibile fornire un ID univoco per ciascun caso di test utilizzando ids, rendendo i report dei test più leggibili:

@pytest.mark.parametrize("num1, num2, expected", [
    (10, 20, 15),
    (20, 30, 25),
    (5, 5, 5)
], ids=["integers", "more integers", "equal numbers"])
def test_calculate_average_with_ids(num1, num2, expected):
    assert calculate_average(num1, num2) == expected

In questo codice, ogni set di parametri ha un ID associato che descrive il caso di test, il quale apparirà nell'output dei test.

Ecco come potrebbe apparire l'output:

===================== test session starts ======================
collected 3 items

test_example.py::test_calculate_average_with_ids[integers] FAILED
test_example.py::test_calculate_average_with_ids[more integers] PASSED
test_example.py::test_calculate_average_with_ids[equal numbers] PASSED

=========================== FAILURES ===========================
________________ test_calculate_average_with_ids[integers] ________________

num1 = 10, num2 = 20, expected = 15

    def test_calculate_average_with_ids(num1, num2, expected):
>       assert calculate_average(num1, num2) == expected
E       assert 20 == 15 
E        +  where 20 = calculate_average(10, 20)

test_example.py:10: AssertionError
================== 1 failed, 2 passed in 0.23s ==================

1. Considera una funzione che moltiplica due numeri. Completa il caso di test riempiendo le parti mancanti:

2. Qual è il principale vantaggio di specificare identificatori utilizzando id o ids in @pytest.mark.parametrize?

question mark

Considera una funzione che moltiplica due numeri. Completa il caso di test riempiendo le parti mancanti:

Select the correct answer

question mark

Qual è il principale vantaggio di specificare identificatori utilizzando id o ids in @pytest.mark.parametrize?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

bookParametrizzazione dei Test in Pytest: Esecuzione dei Test con Input Multipli

Scorri per mostrare il menu

Il testing parametrizzato è fondamentale per migliorare la copertura dei test senza dover scrivere numerose funzioni di test per scenari che differiscono solo per i loro input e output attesi. Questo approccio non solo consente di risparmiare tempo, ma aumenta anche la chiarezza e la manutenibilità delle suite di test grazie a:

  • Riduzione della duplicazione del codice e del potenziale di errori nel codice di test;
  • Possibilità di aggiungere facilmente nuovi casi di test semplicemente aggiungendo parametri;
  • Facilitazione di test completi su un'ampia gamma di input.

Consideriamo una semplice funzione che calcola la media di due numeri. Può verificarsi un errore logico se si dimenticano le parentesi. Utilizzeremo @pytest.mark.parametrize per testare questa funzione con diverse coppie di numeri.

# Function to test
def calculate_average(num1, num2):
    return (num1 + num2) / 2

# Test function using pytest's parametrize
import pytest

@pytest.mark.parametrize(
    "num1, num2, expected",
    [
        (10, 20, 15),
        (20, 30, 25),
        (5, 5, 5)
    ])
def test_calculate_average(num1, num2, expected):
    assert (calculate_average(num1, num2) == expected), f"Average of {num1} and {num2} should be equal to {(num1 + num2) / 2}"

Questo esempio mostra come eseguire test_calculate_average con tre diversi set di numeri, verificando se la funzione calcola correttamente la loro media.

Sintassi con id

Il parametro id viene utilizzato per assegnare un identificatore a ciascun set di input, facilitando l'identificazione dei test nell'output:

 @pytest.mark.parametrize("num1, num2, expected", [
    pytest.param(10, 20, 15, id="integers"),
    pytest.param(20, 30, 25, id="more integers"),
    pytest.param(5, 5, 5, id="equal numbers")
])
def test_calculate_average_with_ids(num1, num2, expected):
    assert calculate_average(num1, num2) == expected

L'utilizzo di pytest.param consente un controllo più granulare su ciascun caso di test, inclusa l'impostazione diretta degli ID individuali.

Sintassi con ids

È anche possibile fornire un ID univoco per ciascun caso di test utilizzando ids, rendendo i report dei test più leggibili:

@pytest.mark.parametrize("num1, num2, expected", [
    (10, 20, 15),
    (20, 30, 25),
    (5, 5, 5)
], ids=["integers", "more integers", "equal numbers"])
def test_calculate_average_with_ids(num1, num2, expected):
    assert calculate_average(num1, num2) == expected

In questo codice, ogni set di parametri ha un ID associato che descrive il caso di test, il quale apparirà nell'output dei test.

Ecco come potrebbe apparire l'output:

===================== test session starts ======================
collected 3 items

test_example.py::test_calculate_average_with_ids[integers] FAILED
test_example.py::test_calculate_average_with_ids[more integers] PASSED
test_example.py::test_calculate_average_with_ids[equal numbers] PASSED

=========================== FAILURES ===========================
________________ test_calculate_average_with_ids[integers] ________________

num1 = 10, num2 = 20, expected = 15

    def test_calculate_average_with_ids(num1, num2, expected):
>       assert calculate_average(num1, num2) == expected
E       assert 20 == 15 
E        +  where 20 = calculate_average(10, 20)

test_example.py:10: AssertionError
================== 1 failed, 2 passed in 0.23s ==================

1. Considera una funzione che moltiplica due numeri. Completa il caso di test riempiendo le parti mancanti:

2. Qual è il principale vantaggio di specificare identificatori utilizzando id o ids in @pytest.mark.parametrize?

question mark

Considera una funzione che moltiplica due numeri. Completa il caso di test riempiendo le parti mancanti:

Select the correct answer

question mark

Qual è il principale vantaggio di specificare identificatori utilizzando id o ids in @pytest.mark.parametrize?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 4
some-alt