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 :
| Fonction | Ce qu'elle fait |
|---|---|
| Séquencement | Exécute les étapes de test dans l'ordre avec branchements et boucles |
| Collecte des mesures | Enregistre les valeurs avec unités et limites |
| Décisions pass/fail | Compare les mesures aux limites, détermine le résultat |
| Interaction opérateur | Demande des saisies, affiche l'état |
| Journalisation des données | Stocke les résultats pour la traçabilité et l'analyse |
| Gestion des plugins/pilotes | Initialise 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 TestStand | Framework TofuPilot | OpenHTF | OpenTAP | pytest + plugins | HardPy |
|---|---|---|---|---|---|---|
| Langage | LabVIEW/C#/VB | Python (moteur Rust) | Python | C#/.NET | Python | Python |
| Licence | Propriétaire (3-5 K$) | MIT | Apache 2.0 | MPL 2.0 | MIT | Apache 2.0 |
| Plateforme | Windows uniquement | Windows/Linux/macOS | Windows/Linux/macOS | Windows/Linux | Windows/Linux/macOS | Windows/Linux/macOS |
| Origine | National Instruments | TofuPilot | Keysight | Communauté | EverPin | |
| Mesures avec limites | Oui | Oui (validators YAML) | Oui | Oui | Via plugins | Oui |
| Séquencement des phases/étapes | Éditeur visuel | Procédure YAML | Décorateurs Python | Classes C# | Fonctions de test | Fonctions de test |
| Interface opérateur | OIs intégrées | Déclarative, depuis la procédure | Station Server | Operator Panel | Aucune intégrée | Panneau navigateur |
| Phases parallèles | Oui | Oui (moteur Rust) | Non | Oui | Via xdist | Non |
| Bancs multi-slots | Oui | Oui | Limité | Oui | Manuel | Non |
| Plugins instruments | Pilotes NI | Plugs (classes simples) | Système de Plugs | Plugins DUT/Instrument | Fixtures | Fixtures |
| Déploiement sur stations | Manuel | Push Git, rollback instantané | Manuel | Manuel | Manuel | Manuel |
| Export des données | ATML, personnalisé | JSON, dashboard | JSON, protobuf | CSV, personnalisé | JUnit XML | JSON |
| Contrôle de version | Difficile (binaire) | Natif Git | Natif Git | Natif Git | Natif Git | Natif Git |
| Communauté | Grande (forums NI) | Récente, plus petite | Petite (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.yaml24 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.1def voltage_check(measurements, dmm): measurements.supply_voltage = dmm.measure_voltage()class Multimeter: def measure_voltage(self) -> float: return 5.01 # Remplacer par une vraie lecture instrumentLancez-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
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
[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
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
| Situation | Recommandation |
|---|---|
| Nouveau système de test en production en Python | Framework TofuPilot |
| Ligne limitée par le débit, plusieurs cartes par banc | Framework TofuPilot (multi-slot) |
| Opérateurs guidés sur la station | Framework TofuPilot (UI déclarative) |
| Validation de la forme d'une waveform ou d'un sweep | Framework TofuPilot (validators par axe) |
| OpenHTF déjà en production | Gardez OpenHTF ; il tourne nativement sur le CLI TofuPilot |
| Un seul paradigme Python pur, sans couche YAML | OpenHTF |
| Utilisation existante de pytest pour les tests matériels | Ajouter le SDK TofuPilot pour la journalisation et l'interface opérateur |
| Environnement .NET avec instruments Keysight | OpenTAP |
| Besoin du panneau opérateur le plus simple possible | HardPy |
| 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édiatement | Framework TofuPilot (tofupilot run, sans compte) |
| Besoin d'analyses, traçabilité et interface opérateur | N'importe quel framework + TofuPilot |
Comparaison des coûts
| Solution | Licence logicielle | Coût par station | Interface opérateur | Analyses de données |
|---|---|---|---|---|
| NI TestStand | 3-5 K$/poste | 3-5 K$ | Incluse | NI InsightCM (en supplément) |
| Framework TofuPilot | Gratuit (MIT) | 0 $ | Incluse, déclarative | Incluses |
| OpenHTF + TofuPilot | Gratuit | 0 $ | Incluse (tous les niveaux) | Incluses |
| OpenTAP | Gratuit (noyau) | 0 $ | Plugin (licence potentiellement nécessaire) | Personnalisées |
| pytest + TofuPilot | Gratuit | 0 $ | Via TofuPilot | Incluses |
| HardPy | Gratuit | 0 $ | Incluse | Basiques |
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.
