What Is End-of-Line Testing with TofuPilot
End-of-line (EOL) testing is the final functional check a unit goes through before it leaves the production line. It catches defects that earlier process steps missed, and it produces the test record that proves the unit works. This guide covers what EOL testing involves, how to build an EOL test in Python, and how to log results to TofuPilot automatically.
What End-of-Line Testing Covers
EOL testing validates that a finished product meets its functional specification. It runs after assembly is complete and before packaging.
A typical EOL test checks:
| Check | Example |
|---|---|
| Power-up | Unit draws expected current at nominal voltage |
| Communication | Serial, I2C, or CAN bus responds correctly |
| Sensor output | Readings fall within calibrated limits |
| Actuator response | Motor spins, valve opens, relay clicks |
| Firmware version | Matches the released build |
| Safety | Leakage current below regulatory threshold |
EOL testing is pass/fail. Every unit gets the same sequence. The goal is coverage and speed, not deep characterization.
EOL vs Other Test Stages
| Stage | When | Purpose |
|---|---|---|
| Incoming inspection | Before assembly | Verify raw materials and components |
| In-circuit test (ICT) | After SMT | Check solder joints and component placement |
| Functional test (FCT) | After assembly | Validate subsystem behavior |
| End-of-line test | After final assembly | Confirm the complete product works |
| Outgoing quality audit | After EOL | Sample-based verification for shipping |
EOL testing is the last gate. If a unit fails here, it goes to rework or scrap. If it passes, it ships.
Prerequisites
- Python 3.10+
- OpenHTF installed (
pip install openhtf) - TofuPilot Python SDK installed (
pip install tofupilot)
Step 1: Define the Test Phases
Each EOL check becomes an OpenHTF phase. Keep phases short and independent so failures are easy to isolate.
import openhtf as htf
from openhtf.util import units
@htf.measures(
htf.Measurement("supply_current_mA")
.in_range(minimum=45, maximum=55)
.with_units(units.MILLIAMPERE)
)
def phase_power_up(test):
"""Verify the unit draws expected current at 5V."""
test.measurements.supply_current_mA = 50.2
@htf.measures(
htf.Measurement("firmware_version").equals("2.4.1")
)
def phase_firmware_check(test):
"""Confirm firmware matches the released build."""
test.measurements.firmware_version = "2.4.1"
@htf.measures(
htf.Measurement("sensor_reading")
.in_range(minimum=2.8, maximum=3.3)
.with_units(units.VOLT)
)
def phase_sensor_output(test):
"""Check that the onboard sensor reads within spec."""
test.measurements.sensor_reading = 3.05Step 2: Assemble and Run the Test
Wire the phases into a test and connect TofuPilot. Every run uploads automatically.
from tofupilot.openhtf import TofuPilot
test = htf.Test(
phase_power_up,
phase_firmware_check,
phase_sensor_output,
)
with TofuPilot(test):
test.execute(test_start=lambda: input("Scan serial number: "))When the operator scans a serial number, OpenHTF runs all three phases in order. TofuPilot logs the result, measurements, and pass/fail status.
Step 3: Track Results in TofuPilot
TofuPilot tracks EOL test results automatically. Open the Analytics tab to see:
- First pass yield across shifts and stations
- Measurement distributions with limit overlays
- Failure Pareto showing which phases fail most often
- Unit traceability linking each serial number to its test record
This data feeds directly into quality reviews and customer audits without manual reporting.
When to Use EOL Testing
EOL testing makes sense when:
- Every unit must be individually verified before shipment
- Regulatory or customer requirements demand test records per serial number
- The product has multiple subsystems that interact after final assembly
- Field returns need to be traceable back to production test data
For low-volume, high-mix production, EOL tests often run on a single station with an operator. For high-volume lines, EOL stations run unattended with automated fixturing.