Migrating from Legacy Systems

Comparaison des frameworks de test

Comparaison des frameworks de test de fabrication (OpenHTF, pytest, OpenTAP, TestStand) avec des exemples de code, des matrices de fonctionnalités, une.

JJulien Buteau
intermediate14 min de lecture14 mars 2026

Quatre frameworks dominent l'automatisation des tests de fabrication : OpenHTF, pytest, OpenTAP et NI TestStand. Chacun fait des compromis différents entre structure, flexibilité, coût et écosystème. Ce guide les compare avec du code réel, des métriques concrètes et des critères de décision pour vous aider à choisir le bon.

Vue d'ensemble des frameworks

FrameworkLangageLicenceOrigineFocus
OpenHTFPythonApache 2.0 (gratuit)GoogleTest de fabrication/production
pytestPythonMIT (gratuit)CommunautéTest logiciel, adapté au hardware
OpenTAPC# / PythonMPL 2.0 (gratuit)KeysightAutomatisation de test avec instruments
NI TestStandLabVIEW / C / PythonCommercial (4 310 $/poste)NI (Emerson)Test de fabrication entreprise

Matrice de comparaison des fonctionnalités

FonctionnalitéOpenHTFpytestOpenTAPTestStand
Mesures structuréesIntégré (nom, valeur, limites, unités)Manuel (assert uniquement)Via pluginsIntégré
Saisie du numéro de sérieInvite intégréeManuelPluginIntégré
Interface opérateurInterface web intégréeAucuneIntégrée (éditeur GUI)Intégrée (Sequence Editor)
Séquencement des testsOrdre des phasesOrdre des fonctions (plugins)Ordre des étapes (GUI)Fichiers de séquence (GUI)
DUT parallèlesLimitéNatif (pytest-xdist)NatifNatif
Pilotes d'instrumentsPlugs (Python)Fixtures (Python)Plugins (C#/Python)Pilotes NI (LabVIEW)
Format de rapportProtobufJUnit XMLXML/JSONXML/base de données
Contrôle de versionGit (fichiers Python)Git (fichiers Python)Git (XML + code)Difficile (fichiers binaires .seq)
Intégration CI/CDNative (Python)Native (Python)PossibleDifficile
Multi-plateformeLinux, macOS, WindowsLinux, macOS, WindowsLinux, WindowsWindows uniquement
CommunautéPetite (~640 stars)Massive (11K+ stars)Petite (~200 stars)Grande (forums NI)
Courbe d'apprentissageMoyenneFaibleMoyenneÉlevée
Coût annuel (5 postes)0 $0 $0 $~21 550 $

Le même test dans chaque framework

Un test fonctionnel simple : mesurer une tension de rail 3,3 V, vérifier qu'elle est comprise entre 3,2 V et 3,4 V.

OpenHTF

comparison/openhtf_example.py
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot


class DutPlug(htf.plugs.BasePlug):
    def setUp(self):
        self.voltage = 3.31  # Remplacer par la lecture de l'instrument

    def tearDown(self):
        pass


@htf.measures(
    htf.Measurement("rail_3v3")
    .in_range(3.2, 3.4)
    .with_units(units.VOLT),
)
@htf.plug(dut=DutPlug)
def test_power(test, dut):
    test.measurements.rail_3v3 = dut.voltage


def main():
    test = htf.Test(test_power, procedure_id="FCT-001", part_number="PCBA-100")
    with TofuPilot(test):
        test.execute(test_start=lambda: input("Numéro de série : "))


if __name__ == "__main__":
    main()

Points forts : Les mesures sont des données structurées (nom, valeur, limites, unités). Une seule ligne pour l'intégration TofuPilot. L'opérateur reçoit automatiquement une invite de numéro de série.

pytest

comparison/pytest_example.py
import pytest
from tofupilot import TofuPilotClient


@pytest.fixture
def dut():
    connection = {"voltage": 3.31}  # Remplacer par une vraie connexion
    yield connection


def test_power_rail(dut):
    voltage = dut["voltage"]
    assert 3.2 <= voltage <= 3.4, f"Rail 3,3 V : {voltage} V"

Points forts : Familier pour tout développeur Python. Énorme écosystème de plugins. Système de fixtures flexible. Excellent pour la R&D et la validation.

Point faible : Les mesures sont implicites (instructions assert). Pas de données structurées pour l'analytique sans code supplémentaire.

OpenTAP

comparison/opentap_example.cs
// Étape de test OpenTAP en C#
using OpenTap;

[Display("Power Rail Test", Group: "FCT")]
public class PowerRailStep : TestStep
{
    [Display("Lower Limit")]
    public double LowerLimit { get; set; } = 3.2;

    [Display("Upper Limit")]
    public double UpperLimit { get; set; } = 3.4;

    public override void Run()
    {
        double voltage = 3.31; // Remplacer par la lecture de l'instrument
        Results.Publish("rail_3v3", new { Voltage = voltage });

        if (voltage < LowerLimit || voltage > UpperLimit)
            UpgradeVerdict(Verdict.Fail);
    }
}

Points forts : Éditeur d'étapes en GUI pour les non-programmeurs. Forte intégration avec les instruments Keysight. Architecture de plugins pour les plans de test.

Point faible : Langage principal en C# (le plugin Python existe mais est secondaire). Communauté plus restreinte.

NI TestStand

TestStand utilise un éditeur de séquences visuel. Le test équivalent est un fichier de séquence (.seq) avec une étape « Numeric Limit Test » configurée via l'interface : valeur de test = lecture de tension, limite basse = 3,2, limite haute = 3,4.

Points forts : Mature, qualité entreprise. Intégration poussée avec le hardware NI. Génération de rapports, journalisation en base de données, exécution parallèle intégrées.

Point faible : 4 310 $/poste/an. Windows uniquement. Les fichiers de séquence binaires ne se versionnent pas bien. Dépendance à l'écosystème NI.

Analyse des coûts

OpenHTFpytestOpenTAPTestStand
Licence (5 postes)0 $0 $0 $21 550 $/an
Licence (20 postes)0 $0 $0 $86 200 $/an
Déploiement runtimeGratuitGratuitGratuitLicences runtime supplémentaires
FormationAuto-formation (docs)Auto-formation (docs)Auto-formation (docs)Formations NI (2 000 $+)
Verrouillage fournisseurAucunAucunFaible (proche Keysight)Élevé (écosystème NI)
SupportCommunauté (GitHub)Communauté (massive)Communauté + KeysightContrat de support NI

Quand utiliser chaque framework

ScénarioMeilleur choixPourquoi
FCT en production, équipe PythonOpenHTFConçu pour le test de fabrication, mesures structurées, interface opérateur
Validation R&D, CI firmwarepytestFlexible, itération rapide, natif CI/CD, énorme écosystème
Instruments multi-fournisseurs, entrepriseOpenTAPArchitecture de plugins, éditeur GUI, intégration Keysight
Hardware NI existant, grande entrepriseTestStandIntégration NI poussée, support entreprise, infrastructure existante
Petite équipe, budget limitéOpenHTF ou pytestAucun coût de licence, écosystème Python
Mixte (R&D + production)pytest + OpenHTFpytest pour la validation, OpenHTF pour la production

Parcours de migration

De TestStand vers OpenHTF

Concept TestStandÉquivalent OpenHTF
Fichier de séquence (.seq)Script de test Python
Types d'étapesFonctions de phase
Numeric Limit Test@htf.measures avec .in_range()
String Value Test@htf.measures avec .equals()
Module d'étape (code)Classe Plug
Process modelIntégration TofuPilot
Génération de rapportsTableau de bord TofuPilot
Numéro de série UUTtest.execute(test_start=lambda: input("Numéro de série : "))

De pytest vers OpenHTF

Concept pytestÉquivalent OpenHTF
Fonction de testFonction de phase
FixturePlug
Instruction assert@htf.measures avec des validateurs
conftest.pyClasses Plug dans un module partagé
JUnit XMLSortie Protobuf + TofuPilot

Intégration TofuPilot

Les quatre frameworks fonctionnent avec TofuPilot :

FrameworkMéthode d'intégrationEffort
OpenHTFNative (with TofuPilot(test))1 ligne
pytestSDK Python (TofuPilotClient)~10 lignes par test
OpenTAPAPI REST ou SDK PythonMoyen
TestStandAPI RESTMoyen

Arbre de décision

  1. Avez-vous une infrastructure TestStand existante ? Oui, et elle fonctionne bien : restez sur TestStand. Oui, mais vous souhaitez migrer : passez à OpenHTF.
  2. Construisez-vous des tests de production ? Oui : OpenHTF. Il a été conçu pour cela.
  3. Faites-vous de la R&D ou de la validation firmware ? Oui : pytest. Plus flexible, meilleur pour le CI/CD.
  4. Avez-vous besoin d'une interface graphique pour les non-programmeurs ? Oui : OpenTAP. Éditeur d'étapes visuel.
  5. Pas sûr ? Commencez par pytest. C'est le plus facile à apprendre et vous pouvez toujours ajouter OpenHTF pour la production par la suite.

Plus de guides

Mettez ce guide en pratique