Salta el contingut

Testing automàtic#

Un dels casos d'ús més interessants és el testing automàtic. En aquest exemple es mostrarà com FakeNOS pot ajudar a fer fàcilment el testing per tu en la teva llibreria. No està destinat a substituir altres tipus de proves, com les proves unitàries, sinó més aviat complementar-les donant una plataforma falsa lleugera. Primer farem l'script i després la prova, encara que es recomana fer-ho al revés (TDD).

Script#

L'script següent és similar al que s'explica abans a l'exemple developing_scripts. Es recomana fer primer aquest exemple. En resum, entra en un dispositiu Huawei SmartAX, obté el valor de totes les ONTs en un port i després busca el número de sèrie de la primera.

from netmiko import ConnectHandler
from ntc_templates.parse import parse_output

credentials = {
    "host": "192.168.0.1",
    "username": "admin",
    "password": "admin",
    "port": 22,
    "device_type": "huawei_smartax"
}

def get_serial_number(sn_index: int = 0) -> str:
    """
    This functions connects to the device and get
    the ONT in the indicated index.
    """
    ont_serial_number: str = ''
    with ConnectHandler(**credentials) as conn:
        output = conn.send_command("display ont info summary ont")
        parsed_output = parse_output(
            platform="huawei_smartax",
            command="display ont info summary 0/1/0",
            data=output
        )
        ont_serial_number = parsed_output[0]['serial_number']
    return ont_serial_number

if __name__ == "__main__":
    serial_number_first_ont = get_serial_number(0)
    print(f"Serial number of the first ONT: {serial_number_first_ont}")

Note

És important notar que aquestes credencials no són reals.

L'anterior fitxer el nomenarem main.py

Testing#

Per ara tenim un script que encara no s'ha provat, i tot i així, ja es podria utilitzar, es recomana fer algun tipus de prova abans. Encara millor, ara que tens FakeNOS pots utilitzar aquesta increïble llibreria 😝.

Escriurem la prova, i farem alguna explicació:

from unittest.mock import patch
from fakenos import FakeNOS
import main

inventory = {
    "hosts": {
        "R1": {
            "username": "user",
            "password": "user",
            "port": 6000,
            "platform": "huawei_smartax",
        }
    }
}

fake_credentials = {
    "host": "localhost",
    "username": "user",
    "password": "user",
    "port": 6000,
    "device_type": "huawei_smartax",
}

@patch('main.credentials', fake_credentials)
def test_get_serial_number():
    """
    It tests that the function get_serial_number() gets
    the first ONT serial number correctly.
    """
    net = FakeNOS(inventory=inventory)
    net.start()
    result = main.get_serial_number(0)
    assert result == "1234567890ABCDEF"

    net.stop()

if __name__ == "__main__":
    test_get_serial_number()
    print("All test passed ✅")

Aquest test realitzarà els següents passos: 1. Crear el dispositiu fals i iniciar-lo 2. Realitzar l'acció a provar 3. Tancar els dispositius falsos

En cas de testing automàtic, sempre cal seguir la mateixa estructura. Aquest sandvitx és necessari. En cas que no cridis al net.stop() les suites de proves es quedaran penjades ja que algun fil intern seguirà esperant noves connexions.

Note

Hi ha plans per fer-ho amb un decorador com @fakenos(platform="cisco_ios"), però per ara aquesta és la principal manera de fer-ho. Les PR que ho facin són més que benvingudes! 😃

Implementat amb el with#

New

Implementat a la versió: v1.0.2

L'exemple anterior es pot implementar utilitzant l'expressió with. Aquesta és una manera més pythonica de fer-ho, i es recomana utilitzar-la. L'exemple anterior es podria reescriure de la següent manera:

from fakenos import FakeNOS

with FakeNOS(inventory=inventory) as net:
    result = main.get_serial_number(0)

Implementat amb un decorador#

New

Implementat a la versió: v1.0.2

També es pot implementar amb un decorador. Aquesta és encara una manera més pythonica de fer-ho. Personalment, és la meva manera preferida. L'exemple anterior es podria reescriure de la següent manera:

from fakenos import fakenos

@fakenos(platform="huawei_smartax")
def test_get_serial_number():
    """
    It tests that the function get_serial_number() gets
    the first ONT serial number correctly.
    """
    result = main.get_serial_number(0)
    assert result == "1234567890ABCDEF"

El decorador gestiona l'inici i la parada dels dispositius falsos, creant l'inventari abans d'iniciar i aturant-lo després de la prova. Aquest decorador és perfectament adequat per a una sola plataforma. Però també per a moltes plataformes utilitzant el teu inventari personalitzat.

from fakenos import fakenos

@fakenos(inventory=inventory)
def test_get_serial_number():
    """
    It tests that the function get_serial_number() gets
    the first ONT serial number correctly.
    """
    result = main.get_serial_number(0)
    assert result == "1234567890ABCDEF"

Finalment, només en cas que vulguis accedir als dispositius falsos, pots fer-ho afegint el paràmetre return_instance al decorador. Això retornarà la instància dels dispositius falsos a la prova. Això és útil quan vols fer alguna prova addicional sobre els dispositius falsos o connectar-hi directament.

from fakenos import fakenos

@fakenos(platform="huawei_smartax", return_instance=True)
def get_ports_used_in_decorator():
    """ Volem veure els ports del dispositiu fals """
    host_ports = [host.port for hosts in net.hosts.values()]
    print(host_ports)

En aquest cas obtinc el següent resultat:

>> [60231]

Note

Per defecte, el return_instance és False, així que si vols utilitzar-lo, has de posar-ho a True.

Note

Quan utilitzes el paràmetre de la plataforma, s'assignarà un port aleatori. Aquesta decisió és intencional perquè les proves no afectin altres sistemes. Si vols utilitzar un port específic, pots especificar-lo utilitzant l'inventari.