Skip to content
Test Types & Methods

ICT vs FCT vs Flying Probe: When to Use Each

Compare in-circuit test (ICT), functional test (FCT), and flying probe for PCBA manufacturing, with cost analysis, coverage tradeoffs, and decision criteria.

JJulien Buteau
intermediate10 min readMarch 14, 2026

Three test methods dominate PCBA manufacturing: in-circuit test (ICT), functional test (FCT), and flying probe. Each catches different defects at different costs. Most production lines use two or three in combination. This guide compares them so you can choose the right test strategy for your product.

Quick Comparison

ICTFCTFlying Probe
What it testsIndividual componentsBoard-level behaviorIndividual components
Defects caughtWrong value, missing, short, openPower, comms, firmware, performanceSame as ICT
Test time5-30 seconds30 seconds - 5 minutes1-10 minutes
Fixture cost$5,000-50,000$1,000-10,000None (fixtureless)
NRE time4-8 weeks1-2 weeksHours (program only)
Volume sweet spot10K+ units/yearAny volumePrototypes, < 5K units/year
AutomationFully automatedFully automatedFully automated
Board accessBed-of-nails (needs test pads)Connectors + probesProbes (no fixture)
ProgrammingVendor softwarePython/LabVIEW/customVendor software

In-Circuit Test (ICT)

ICT presses a bed-of-nails fixture against the board and tests each component individually. It verifies that the right components are in the right places with the right values.

What ICT Catches

DefectDetection Method
Wrong resistor valueResistance measurement
Missing componentOpen circuit detection
Solder shortShort circuit detection
Wrong polarity (capacitor, diode)Capacitance/diode test
IC pin opensBoundary scan (JTAG)
BGA connection issuesLimited (only accessible pins)

ICT Costs

ItemTypical Cost
Fixture (bed-of-nails)$5,000-50,000 depending on board complexity
Fixture lead time4-8 weeks
ICT machine$50,000-500,000 (capital)
Test time per board5-30 seconds
Program development$2,000-10,000

When to Use ICT

  • High volume (10K+ boards/year). The fixture cost amortizes over volume.
  • Complex boards with many passives. ICT excels at verifying resistor/capacitor values.
  • SMT assembly with known defect rates. ICT catches assembly defects before FCT.
  • When you need fast test time. 5-30 seconds vs. minutes for FCT.

When to Skip ICT

  • Low volume (< 5K/year). Fixture cost doesn't justify the volume.
  • Simple boards (< 50 components). FCT alone catches most defects.
  • Fast design iteration. Fixture changes with every board revision.
  • BGA-heavy designs. ICT can't access BGA pads without boundary scan.

Functional Test (FCT)

FCT tests the board as a working system. You power it up, run the firmware, and verify behavior. FCT catches defects that ICT misses: firmware bugs, timing issues, analog performance, and system-level interactions.

What FCT Catches

DefectDetection Method
Voltage regulator failurePower rail measurement
Wrong firmwareVersion query
Communication failureUART/SPI/I2C response check
Excessive current draw (short)Current measurement
Wrong crystal frequencyFrequency measurement
ADC/DAC calibration driftAnalog measurement
Failed self-testFirmware self-test command

FCT Costs

ItemTypical Cost
Test fixture (pogo pins + connectors)$1,000-10,000
Fixture lead time1-2 weeks
Instruments (DMM, PSU, etc.)$2,000-20,000 (one-time, reusable)
Test time per board30 seconds - 5 minutes
Script developmentPython + OpenHTF (free tools)

When to Use FCT

  • Every production board should get FCT. It's the final check before shipping.
  • Any volume. Low fixture cost makes it viable even for 100 units/year.
  • After ICT. FCT verifies system behavior that ICT can't test.
  • As the only test for simple boards. If the board has < 50 components, FCT alone may suffice.

FCT with Python and TofuPilot

ict_vs_fct/fct_example.py
import openhtf as htf
from openhtf.plugs import BasePlug
from openhtf.util import units
from tofupilot.openhtf import TofuPilot


class BoardPlug(BasePlug):
    """Board interface for FCT."""

    def setUp(self):
        self._voltages = iter([3.31, 5.01, 1.81])
        self._current = 0.12

    def read_voltage(self) -> float:
        return next(self._voltages)

    def read_current(self) -> float:
        return self._current

    def query_firmware(self) -> str:
        return "2.1.0"

    def tearDown(self):
        pass


@htf.measures(
    htf.Measurement("rail_3v3").in_range(3.2, 3.4).with_units(units.VOLT),
    htf.Measurement("rail_5v0").in_range(4.8, 5.2).with_units(units.VOLT),
    htf.Measurement("rail_1v8").in_range(1.7, 1.9).with_units(units.VOLT),
)
@htf.plug(board=BoardPlug)
def test_power(test, board):
    test.measurements.rail_3v3 = board.read_voltage()
    test.measurements.rail_5v0 = board.read_voltage()
    test.measurements.rail_1v8 = board.read_voltage()


@htf.measures(
    htf.Measurement("firmware_version").equals("2.1.0"),
    htf.Measurement("idle_current").in_range(0.05, 0.20).with_units(units.AMPERE),
)
@htf.plug(board=BoardPlug)
def test_system(test, board):
    test.measurements.firmware_version = board.query_firmware()
    test.measurements.idle_current = board.read_current()


def main():
    test = htf.Test(
        test_power,
        test_system,
        procedure_id="FCT-001",
        part_number="PCBA-100",
    )
    with TofuPilot(test):
        test.execute(test_start=lambda: input("Scan serial number: "))

Every measurement flows into TofuPilot with limits, units, and pass/fail status. You get FPY, Cpk, and failure Pareto automatically.

Flying Probe

Flying probe machines use motorized probes that move to each test point. No fixture needed. The machine programs from your Gerber files and netlist.

What Flying Probe Catches

Same defects as ICT: shorts, opens, wrong values, missing components. Some machines add:

  • Capacitance measurement
  • Inductance measurement
  • Boundary scan (JTAG) integration
  • Basic functional tests (limited)

Flying Probe Costs

ItemTypical Cost
Fixture$0 (fixtureless)
Setup timeHours (from Gerber + netlist)
Machine$100,000-500,000 (capital)
Test time per board1-10 minutes (depends on test points)
Per-board cost at CM$5-50 depending on program complexity

When to Use Flying Probe

  • Prototypes and first articles. Zero fixture cost, fast setup.
  • Low volume (< 5K/year). Cheaper than ICT fixtures.
  • Design iteration. No fixture to modify when the board changes.
  • Complex BGAs. Some flying probe machines can test BGA pads via boundary scan.

When to Skip Flying Probe

  • High volume. Too slow (1-10 minutes vs. 5-30 seconds for ICT).
  • When you need FCT anyway. Flying probe doesn't replace FCT for system-level tests.
  • Budget constraints at CM. Some contract manufacturers charge premium for flying probe time.

Test Strategy by Volume

Volume (units/year)Recommended StrategyWhy
1-100 (prototype)FCT onlyLow volume, simple fixture, catches most defects
100-1,000Flying probe + FCTFlying probe catches assembly defects, FCT catches system issues
1,000-10,000Flying probe or ICT + FCTEvaluate ICT fixture ROI at upper end
10,000-100,000ICT + FCTICT fixture pays for itself, fast test time
100,000+AOI + ICT + FCTFull coverage, maximum throughput

Test Strategy by Board Complexity

Board ComplexityComponentsRecommended Tests
Simple (LED driver, sensor board)< 50FCT only
Medium (MCU board, IoT device)50-200Flying probe + FCT
Complex (multi-rail, mixed signal)200-500ICT + FCT
Very complex (RF, high-speed digital)500+AOI + ICT + FCT + specialized

Coverage Comparison

Defect TypeAOIICTFlying ProbeFCT
Missing componentYesYesYesSometimes
Wrong valueNoYesYesSometimes
Solder shortYesYesYesSometimes
Cold solder jointYesNoNoSometimes
TombstoningYesNoNoNo
Wrong polarityNoYesYesSometimes
Firmware bugNoNoNoYes
Power rail issueNoNoNoYes
Communication failureNoNoNoYes
Performance degradationNoNoNoYes

No single test method catches everything. The combination of ICT (or flying probe) for assembly defects plus FCT for system defects gives you the best coverage.

More Guides

Put this guide into practice