Salesforce Apex Testing CI

shipfeatures faster

Tests whose fingerprint changed run on the org; the rest can reuse their stored results.

Local CLI

Install on your machine

Run LATdx from your terminal to cache Apex test results and skip unchanged reruns.

$curl -fsSL https://latdx.com/install.sh | bash

or read the documentation

One fingerprint per test method

latdx parses your Apex into a dependency graph and fingerprints each test method from the Apex it statically reaches plus your tracked metadata. A test runs when its fingerprint changes; a cached PASS means every input latdx tracks for that test is unchanged.

Map the reach

The AST links each test method to the Apex it statically reaches. Tracked metadata, like objects and triggers, goes into every key.

Fingerprint it

Each cacheable test method gets a SHA-256 key over the method bodies it reaches plus your tracked metadata.

Run or reuse

Same key: the stored result is reused. No stored result for that key: the test runs on the org.

AccountServiceTest.clsAccountTriggerTest.clsAccountService.clsAccountTrigger.triggerAccount · schemaDMLtestHappyPathkeye3987368hittestValidatekey13573870hittestRollbackkey11873baahittestBeforeInsertkey2de2a1e8hittestBeforeDeletekeyf7899e98hitvalidate()save() · insert acctrollback()before insert · deleteNameText(80)IndustryPicklistAnnualRevenueCurrencyIndustryRequiredRule
all 5 test methods cached · every fingerprint matches

Click any method, field, trigger or rule to change it. Click a test to inspect its fingerprint.

key unchanged
key changes
fingerprint

testHappyPath()

sha256(

  • bodytestHappyPath()
  • apexAccountService.validate()
  • apexAccountService.save()
  • objAccount objects/**
  • metashared manifest

)

= key

matches the stored entry → result reused, test not sent to the org

Apex ingredients are hashed from the parsed token stream; objects and the shared manifest are hashed from their file contents, so even a comment in a trigger counts. If any line above changes, the key changes and the test reruns. LATdx keeps up to 5 recent keys per method, so undoing a change can reuse the earlier result, unless saving the class already dropped it.

shared manifest = triggers · flows · workflow + validation rules · labels · custom metadata · profiles · permission sets · sharing rules · approval + assignment rules · more. One edit there reruns everything: your status quo, plus key computation.

Comments and formatting in Apex classes don't change a key. Saving an Apex class after a run drops the stored results of test classes that depend on it, directly or through other classes.

Any edit to tracked metadata (objects, fields, flows, triggers, validation rules and more) changes every test's key, so every test misses the cache on its next run.

Code called by name at runtime (Type.forName, Callable) isn't traced yet.

Known limitations →

How the cache answers the hard cases

Early access

Lock in launch pricing

Subscribe today and keep your rate for the life of the subscription. New subscribers pay double after launch.

Cancel anytimeNo card for FreeProrated immediatelyEarly access price locked

Free

$0forever

100 tests / run. No card required.

  • Method-level caching
  • Live test results
  • PR-related tests only
  • 100 tests per run
  • —Watch mode
  • —Run tests in CI

Pro

$20$10/ mo

Unlimited tests on your machine.

  • Method-level caching
  • Live test results
  • PR-related tests only
  • Unlimited tests per run
  • Watch modeComing soon
  • —Run tests in CI

TEAM/CI

$200$100/ mo

CI license. 5 Pro seats included.

  • Method-level caching
  • Live test results
  • PR-related tests only
  • Unlimited tests per run
  • Watch modeComing soon
  • Run tests in CI
PRO Seats

Common questions