Test Data & Analytics

Analyser les performances des étapes

Apprenez à décomposer les performances de test par étape pour identifier les phases qui échouent le plus, les plus lentes ou avec le Cpk le plus bas grâce.

JJulien Buteau
intermediate7 min de lecture14 mars 2026

Un test qui échoue vous dit que quelque chose s'est mal passé. L'analyse au niveau des étapes vous dit exactement où. TofuPilot décompose chaque exécution par phase pour que vous puissiez identifier précisément quelles étapes échouent le plus, lesquelles prennent le plus de temps et quelles mesures sont les plus proches de leurs limites.

Pourquoi l'analyse au niveau des étapes est importante

Les taux de pass/fail globaux masquent les problèmes. Un test avec 95 % de FPY semble correct jusqu'à ce que vous découvriez qu'une phase représente 80 % de toutes les défaillances. Sans données au niveau des étapes, vous devinez où concentrer vos efforts d'amélioration.

L'analyse par étape répond à trois questions : Quelles phases ont le taux de réussite le plus bas ? Quelles mesures ont le Cpk le plus bas ? Quelles étapes prennent le plus de temps ?

Structurer les tests pour de bonnes données par étape

Chaque phase OpenHTF devient une étape dans TofuPilot. Nommez vos phases clairement et gardez chacune centrée sur un seul domaine fonctionnel. Cela rend l'analyse pertinente.

multi_phase_test.py
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot

@htf.measures(
    htf.Measurement("input_voltage")
    .with_units(units.VOLT)
    .in_range(minimum=11.5, maximum=12.5),
    htf.Measurement("input_current")
    .with_units(units.AMPERE)
    .in_range(maximum=2.0),
)
def power_input_check(test):
    """Vérifier que l'entrée d'alimentation est dans les spécifications."""
    test.measurements.input_voltage = 12.03
    test.measurements.input_current = 1.45

@htf.measures(
    htf.Measurement("reg_3v3_output")
    .with_units(units.VOLT)
    .in_range(minimum=3.25, maximum=3.35),
    htf.Measurement("reg_5v_output")
    .with_units(units.VOLT)
    .in_range(minimum=4.90, maximum=5.10),
    htf.Measurement("reg_ripple")
    .in_range(maximum=50.0),
)
def voltage_regulator_test(test):
    """Tester tous les régulateurs de tension embarqués."""
    test.measurements.reg_3v3_output = 3.30
    test.measurements.reg_5v_output = 4.98
    test.measurements.reg_ripple = 22.4

@htf.measures(
    htf.Measurement("i2c_ack_received").with_allowed_values(True),
    htf.Measurement("spi_loopback_ok").with_allowed_values(True),
    htf.Measurement("uart_baud_error_pct")
    .in_range(maximum=2.0),
)
def communication_bus_test(test):
    """Vérifier les interfaces I2C, SPI et UART."""
    test.measurements.i2c_ack_received = True
    test.measurements.spi_loopback_ok = True
    test.measurements.uart_baud_error_pct = 0.8

@htf.measures(
    htf.Measurement("wifi_rssi")
    .in_range(minimum=-70, maximum=-20),
    htf.Measurement("bluetooth_pair_time")
    .in_range(maximum=5.0),
)
def wireless_connectivity_test(test):
    """Tester les connexions WiFi et Bluetooth."""
    test.measurements.wifi_rssi = -45
    test.measurements.bluetooth_pair_time = 2.3

@htf.measures(
    htf.Measurement("flash_write_speed")
    .in_range(minimum=10.0),
    htf.Measurement("flash_read_speed")
    .in_range(minimum=20.0),
    htf.Measurement("eeprom_verify_ok").with_allowed_values(True),
)
def memory_test(test):
    """Vérifier les performances de lecture/écriture de la flash et de l'EEPROM."""
    test.measurements.flash_write_speed = 14.2
    test.measurements.flash_read_speed = 28.7
    test.measurements.eeprom_verify_ok = True

def main():
    test = htf.Test(
        power_input_check,
        voltage_regulator_test,
        communication_bus_test,
        wireless_connectivity_test,
        memory_test,
    )
    with TofuPilot(test):
        test.execute(test_start=lambda: "BOARD-042")

if __name__ == "__main__":
    main()

Ce test comporte cinq phases distinctes, chacune couvrant un sous-système différent. TofuPilot suit les taux de réussite, les distributions de mesures et les temps d'exécution pour chacune indépendamment.

Trouver vos étapes les plus faibles

Dans la vue d'analyse par étape de TofuPilot, triez les phases par taux de réussite pour trouver les maillons faibles. Une phase avec un taux de réussite de 92 % dans un test à cinq phases domine vos pertes de rendement global.

Examinez les mesures au sein de cette phase. Une mesure avec un Cpk inférieur à 1,0 signifie que la variation de votre procédé est trop large pour les spécifications. Soit vous resserrez le procédé, soit vous élargissez les spécifications si le produit peut le tolérer.

Identifier les étapes lentes

Les données de temps par étape révèlent les goulots d'étranglement. Si votre test de connectivité sans fil prend 8 secondes sur un total de 12 secondes, c'est là qu'il faut concentrer la réduction du temps de cycle.

Correctifs courants pour les étapes lentes : réduire le nombre de tentatives, paralléliser les mesures indépendantes, ou optimiser la communication avec les instruments (requêtes par lots au lieu de lectures séquentielles).

Utiliser les données par étape pour prioriser

Combinez le taux de réussite, le Cpk et le temps d'exécution en une liste priorisée. Une étape qui échoue souvent et s'exécute lentement est la cible à plus fort impact. Une étape avec un Cpk élevé et une exécution rapide ne nécessite aucune attention.

L'analytique des mesures de TofuPilot affiche tout cela par phase. Consultez-la chaque semaine pour vérifier si vos améliorations de procédé font réellement évoluer les chiffres.

Plus de guides

Mettez ce guide en pratique