Migrating from Legacy Systems

Alternatives open source aux exécutifs de test

Comparez les exécutifs de test open source : framework TofuPilot, OpenHTF, OpenTAP, pytest et HardPy. Fonctionnalités, interface opérateur et coûts.

JJulien Buteau
intermediate10 min de lecture14 mars 2026

NI TestStand coûte 3 000 à 5 000 $ par poste et fonctionne uniquement sous Windows. Les ingénieurs recherchent des alternatives open source qui fonctionnent sous Linux, s'intègrent avec Git et ne nécessitent pas de licences propriétaires. Ce guide compare les principaux exécutifs de test open source pour la production : le framework TofuPilot, OpenHTF, OpenTAP, pytest (avec des plugins matériels) et HardPy.

Ce que fait un exécutif de test

Un exécutif de test gère l'exécution des séquences de test. Il prend en charge :

FonctionCe qu'elle fait
SéquencementExécute les étapes de test dans l'ordre avec branchements et boucles
Collecte des mesuresEnregistre les valeurs avec unités et limites
Décisions pass/failCompare les mesures aux limites, détermine le résultat
Interaction opérateurDemande des saisies, affiche l'état
Journalisation des donnéesStocke les résultats pour la traçabilité et l'analyse
Gestion des plugins/pilotesInitialise et ferme les connexions aux instruments

TestStand fait tout cela dans une application Windows propriétaire. Les alternatives open source le font dans du code.

Tableau comparatif

FonctionnalitéNI TestStandFramework TofuPilotOpenHTFOpenTAPpytest + pluginsHardPy
LangageLabVIEW/C#/VBPython (moteur Rust)PythonC#/.NETPythonPython
LicencePropriétaire (3-5 K$)MITApache 2.0MPL 2.0MITApache 2.0
PlateformeWindows uniquementWindows/Linux/macOSWindows/Linux/macOSWindows/LinuxWindows/Linux/macOSWindows/Linux/macOS
OrigineNational InstrumentsTofuPilotGoogleKeysightCommunautéEverPin
Mesures avec limitesOuiOui (validators YAML)OuiOuiVia pluginsOui
Séquencement des phases/étapesÉditeur visuelProcédure YAMLDécorateurs PythonClasses C#Fonctions de testFonctions de test
Interface opérateurOIs intégréesDéclarative, depuis la procédureStation ServerOperator PanelAucune intégréePanneau navigateur
Phases parallèlesOuiOui (moteur Rust)NonOuiVia xdistNon
Bancs multi-slotsOuiOuiLimitéOuiManuelNon
Plugins instrumentsPilotes NIPlugs (classes simples)Système de PlugsPlugins DUT/InstrumentFixturesFixtures
Déploiement sur stationsManuelPush Git, rollback instantanéManuelManuelManuelManuel
Export des donnéesATML, personnaliséJSON, dashboardJSON, protobufCSV, personnaliséJUnit XMLJSON
Contrôle de versionDifficile (binaire)Natif GitNatif GitNatif GitNatif GitNatif Git
CommunautéGrande (forums NI)Récente, plus petitePetite (GitHub)Petite (forum)Grande (pytest général)Très petite

Framework TofuPilot

Le framework TofuPilot est un framework de test open source pensé pour le hardware, publié sous licence MIT. Une procédure est un fichier YAML qui déclare la séquence et les limites ; les phases sont des fonctions Python simples et les plugs des classes Python simples.

Points forts

  • Procédure déclarative. Le plan de test vit dans le YAML comme des données, lisible et diffable séparément de la logique.
  • Exécution parallèle. Un moteur Rust exécute les phases indépendantes et plusieurs slots de banc en parallèle pendant que votre code reste du Python simple. C'est ce qui réduit le temps de cycle sur une ligne limitée par le débit.
  • Interface opérateur depuis la procédure. Saisies texte, listes de contrôle, images, curseurs et barres de progression se déclarent dans le YAML, sans travail frontend.
  • Mesures riches. Agrégations (moyenne, min, max, écart-type sur tableaux) et validators par axe qui vérifient la forme d'une courbe, pas seulement ses extrémités.
  • Déploiement intégré. Les procédures se déploient sur les stations via un push Git avec rollback instantané, et les runs se mettent en file d'attente hors ligne puis se synchronisent.

Points faibles

  • Projet plus récent. Communauté plus petite et moins d'exemples publics qu'OpenHTF.
  • Deux fichiers, pas un. La couche YAML est un concept supplémentaire si vous voulez tout en Python.

Exemple

procedure.yaml
24 lines
name: Supply Voltage Checkversion: 1.0.0unit:  serial_number:    default_value: "PCBA000001"  part_number:    default_value: "PCBA-100"plugs:  - name: dmm    python: plugs.dmm:Multimetermain:  - name: Voltage Check    python: phases.voltage_check    measurements:      - name: Supply Voltage        unit: V        validators:          - operator: ">="            expected_value: 4.9          - operator: "<="            expected_value: 5.1
phases/voltage_check.py
def voltage_check(measurements, dmm):    measurements.supply_voltage = dmm.measure_voltage()
plugs/dmm.py
class Multimeter:    def measure_voltage(self) -> float:        return 5.01  # Remplacer par une vraie lecture instrument

Lancez-le avec tofupilot run ./procedure.yaml, qui s'exécute sur votre machine sans compte.

OpenHTF

OpenHTF est le framework de test open source de Google pour la production. Il a été conçu pour tester l'électronique grand public à grande échelle.

Points forts

  • Natif Python. Les tests sont des fonctions Python décorées avec des mesures. Pas d'éditeur visuel, pas de XML, pas de fichiers binaires.
  • Système de Plugs. Les instruments sont injectés automatiquement dans les phases de test. Les Plugs gèrent l'initialisation et la fermeture.
  • Validateurs de mesures. Support intégré des plages, tolérances, regex et correspondance exacte.
  • Station Server. Interface opérateur web à localhost:12000.
  • Éprouvé à grande échelle. Des années d'usage en production et davantage d'exemples publics que les options plus récentes.

Points faibles

  • Documentation. La documentation officielle de Google n'existe pas. La communauté (via openhtf.org) comble le manque.
  • Taille de la communauté. ~640 étoiles GitHub, faible présence sur Stack Overflow.
  • Exécution séquentielle. Les phases s'exécutent dans l'ordre sur une seule unité. Les phases parallèles et les bancs multi-slots s'orchestrent en dehors du framework.
  • Interface intégrée. Le Station Server est fonctionnel mais basique.

Exemple

openhtf_example.py
import openhtf as htffrom openhtf.util import units@htf.measures(    htf.Measurement("voltage_V")    .in_range(minimum=4.9, maximum=5.1)    .with_units(units.VOLT),)def phase_voltage_check(test):    """Mesurer et valider la tension d'alimentation."""    test.measurements.voltage_V = 5.01test = htf.Test(phase_voltage_check)test.execute(test_start=lambda: input("Scanner le numéro de série : "))

Les suites OpenHTF existantes tournent nativement sur le CLI TofuPilot sans réécriture : choisir une plateforme n'impose donc pas de migrer de framework.

OpenTAP

OpenTAP est le framework d'automatisation de test open source de Keysight. Il est écrit en C# et fonctionne sur .NET.

Points forts

  • Soutien de Keysight. Développement actif, support commercial disponible.
  • Écosystème de plugins. Plugins DUT, instrument et écouteurs de résultats.
  • Éditeur de plans de test. Interface graphique pour créer des séquences de test sans code.
  • Multi-plateforme. Fonctionne sous Windows et Linux via .NET.

Points faibles

  • C#/.NET. La plupart des ingénieurs de test préfèrent Python. .NET ajoute de la complexité de déploiement sous Linux.
  • Panneau opérateur. Basique, nécessite une licence Keysight Test Automation pour les fonctionnalités complètes.
  • Courbe d'apprentissage. L'architecture de plugins est puissante mais complexe pour des tests simples.

Exemple

OpenTapExample.cs
[Display("Voltage Check", Description = "Mesurer la tension d'alimentation")]public class VoltageCheck : TestStep{    [Display("Voltage")]    [Unit("V")]    public double Voltage { get; set; }    public override void Run()    {        Voltage = 5.01;        if (Voltage < 4.9 || Voltage > 5.1)            UpgradeVerdict(Verdict.Fail);        else            UpgradeVerdict(Verdict.Pass);    }}

pytest avec plugins matériels

pytest est le framework de test Python standard. Avec les bons plugins, il peut fonctionner pour les tests matériels.

Points forts

  • Communauté massive. La plupart des développeurs Python connaissent déjà pytest.
  • Système de fixtures. Gère proprement l'initialisation et la fermeture des instruments.
  • Écosystème de plugins. Des milliers de plugins pour le reporting, l'exécution parallèle et l'intégration CI.
  • Courbe d'apprentissage faible. Si vous connaissez Python, vous connaissez pytest.

Points faibles

  • Non conçu pour la production. Pas de système de mesures intégré avec limites, unités ou validateurs.
  • Pas d'interface opérateur. Pas d'invites, pas de saisie de numéro de série, pas d'affichage pass/fail.
  • Pas de journalisation native des données. Nécessite du code personnalisé ou des outils tiers pour stocker les résultats.
  • Conçu pour les tests logiciels. Les concepts comme les fixtures, marks et parametrize ne correspondent pas directement aux séquences de test matériel.

Exemple

test_hardware.py
def test_voltage_check(dmm_fixture):    """Mesurer et valider la tension d'alimentation."""    voltage = dmm_fixture.measure_voltage()    assert 4.9 <= voltage <= 5.1, f"Tension {voltage}V hors plage"

HardPy

HardPy ajoute un panneau opérateur en navigateur à pytest pour les tests matériels.

Points forts

  • Natif pytest. Les tests sont des fonctions pytest classiques avec des ajouts spécifiques au matériel.
  • Interface navigateur. Panneau opérateur avec hiérarchie des tests, dialogues et graphiques en temps réel.
  • Stockage des mesures. Intégration CouchDB intégrée pour les résultats de test.
  • Stack moderne. Frontend React, API propre.

Points faibles

  • Projet récent. Adoption limitée, petite communauté.
  • Fonctionnalités basiques. Pas de système de limites de mesure, pas de bandes marginales, pas d'analyses.
  • Dépendance CouchDB. Ajoute de la complexité d'infrastructure.

Quand utiliser chacun

SituationRecommandation
Nouveau système de test en production en PythonFramework TofuPilot
Ligne limitée par le débit, plusieurs cartes par bancFramework TofuPilot (multi-slot)
Opérateurs guidés sur la stationFramework TofuPilot (UI déclarative)
Validation de la forme d'une waveform ou d'un sweepFramework TofuPilot (validators par axe)
OpenHTF déjà en productionGardez OpenHTF ; il tourne nativement sur le CLI TofuPilot
Un seul paradigme Python pur, sans couche YAMLOpenHTF
Utilisation existante de pytest pour les tests matérielsAjouter le SDK TofuPilot pour la journalisation et l'interface opérateur
Environnement .NET avec instruments KeysightOpenTAP
Besoin du panneau opérateur le plus simple possibleHardPy
Migration depuis TestStand, changement minimal souhaitéOpenTAP (architecture la plus proche)
Migration depuis TestStand, Python souhaitéFramework TofuPilot
Budget zéro, besoin d'un système fonctionnel immédiatementFramework TofuPilot (tofupilot run, sans compte)
Besoin d'analyses, traçabilité et interface opérateurN'importe quel framework + TofuPilot

Comparaison des coûts

SolutionLicence logicielleCoût par stationInterface opérateurAnalyses de données
NI TestStand3-5 K$/poste3-5 K$IncluseNI InsightCM (en supplément)
Framework TofuPilotGratuit (MIT)0 $Incluse, déclarativeIncluses
OpenHTF + TofuPilotGratuit0 $Incluse (tous les niveaux)Incluses
OpenTAPGratuit (noyau)0 $Plugin (licence potentiellement nécessaire)Personnalisées
pytest + TofuPilotGratuit0 $Via TofuPilotIncluses
HardPyGratuit0 $IncluseBasiques

Les alternatives open source éliminent les licences par poste. Le coût total de possession dépend du temps d'ingénierie pour la mise en place et la maintenance, et c'est là que l'interface opérateur et le déploiement comptent autant que la logique de test.

Pour une comparaison directe des deux options Python dédiées, voir Framework TofuPilot vs OpenHTF.

Plus de guides

Mettez ce guide en pratique