afv-library/skills/platform-apex-test-run/references/cli-commands.md

5.7 KiB

Salesforce CLI Test Commands Reference

Quick Reference

Task Command
Run single test class sf apex run test --class-names MyTest
Run all local tests sf apex run test --test-level RunLocalTests
Run with coverage sf apex run test --class-names MyTest --code-coverage
Get JSON output sf apex run test --class-names MyTest --result-format json
Run specific methods sf apex run test --tests MyTest.method1 --tests MyTest.method2

Test Execution

Run Single Test Class

sf apex run test \
  --class-names AccountServiceTest \
  --target-org my-sandbox \
  --code-coverage \
  --result-format human

Run Multiple Test Classes

sf apex run test \
  --class-names AccountServiceTest \
  --class-names ContactServiceTest \
  --class-names LeadServiceTest \
  --target-org my-sandbox \
  --code-coverage

Run Specific Test Methods

sf apex run test \
  --tests AccountServiceTest.testCreate \
  --tests AccountServiceTest.testUpdate \
  --target-org my-sandbox

Run All Local Tests

sf apex run test \
  --test-level RunLocalTests \
  --target-org my-sandbox \
  --code-coverage \
  --output-dir test-results

Run Test Suite

sf apex run test \
  --suite-names RegressionSuite \
  --target-org my-sandbox \
  --code-coverage

Test Levels

Level Description
RunSpecifiedTests Only specified tests (default when using --class-names)
RunLocalTests All tests except managed packages
RunAllTestsInOrg All tests including managed packages

Output Formats

Human Readable (Default)

sf apex run test --class-names MyTest --result-format human

JSON (For Parsing)

sf apex run test --class-names MyTest --result-format json

JUnit XML (For CI/CD)

sf apex run test --class-names MyTest --result-format junit

TAP (Test Anything Protocol)

sf apex run test --class-names MyTest --result-format tap

Code Coverage

Basic Coverage

sf apex run test \
  --class-names MyTest \
  --code-coverage \
  --target-org my-sandbox

Detailed Line-by-Line Coverage

sf apex run test \
  --class-names MyTest \
  --code-coverage \
  --detailed-coverage \
  --target-org my-sandbox

Save Results to Directory

sf apex run test \
  --class-names MyTest \
  --code-coverage \
  --output-dir ./test-results \
  --target-org my-sandbox

Output files:

  • test-run-id.json - Test results
  • test-run-id-codecoverage.json - Coverage data

Async Test Execution

Run Tests Asynchronously

sf apex run test \
  --test-level RunLocalTests \
  --target-org my-sandbox \
  --async

Returns a test run ID for checking status later.

Check Async Test Status

sf apex get test \
  --test-run-id 707xx0000000000AAA \
  --target-org my-sandbox

Wait for Test Completion

sf apex run test \
  --test-level RunLocalTests \
  --target-org my-sandbox \
  --wait 10  # Wait up to 10 minutes

Debug Logs During Tests

Enable Debug Logs

# List current log levels
sf apex list log --target-org my-sandbox

# Tail logs in real-time
sf apex tail log --target-org my-sandbox --color

Get Specific Log

sf apex get log \
  --log-id 07Lxx0000000000AAA \
  --target-org my-sandbox

Useful Flags

Flag Description
--code-coverage Include coverage in results
--detailed-coverage Line-by-line coverage (slower)
--result-format Output format (human, json, junit, tap)
--output-dir Save results to directory
--synchronous Wait for completion (default)
--wait Max minutes to wait
--async Return immediately with run ID
--verbose Show additional details
--concise Suppress passing test details (show only failures)
--poll-interval <seconds> Customize polling interval (v2.116.6+)

Common Patterns

Full Test Run with Coverage Report

sf apex run test \
  --test-level RunLocalTests \
  --code-coverage \
  --result-format json \
  --output-dir ./test-results \
  --target-org my-sandbox \
  --wait 30

Quick Validation (Single Test)

sf apex run test \
  --tests AccountServiceTest.testCreate \
  --target-org my-sandbox

CI/CD Pipeline Pattern

# Run tests with JUnit output for CI tools
sf apex run test \
  --test-level RunLocalTests \
  --result-format junit \
  --output-dir ./test-results \
  --code-coverage \
  --target-org ci-sandbox \
  --wait 60

# Check exit code
if [ $? -ne 0 ]; then
  echo "Tests failed!"
  exit 1
fi

Coverage Validation

# Run tests and check minimum coverage
sf apex run test \
  --test-level RunLocalTests \
  --code-coverage \
  --result-format json \
  --output-dir ./test-results \
  --target-org my-sandbox

# Parse coverage from JSON (requires jq)
coverage=$(jq '.result.summary.orgWideCoverage' ./test-results/*.json | tr -d '"' | tr -d '%')
if [ "$coverage" -lt 75 ]; then
  echo "Coverage $coverage% is below 75% threshold!"
  exit 1
fi

Troubleshooting

Test Timeout

# Increase wait time for long-running tests
sf apex run test \
  --test-level RunAllTestsInOrg \
  --wait 120 \
  --target-org my-sandbox

No Test Results

Check if tests exist:

sf data query --query "SELECT Id, Name FROM ApexClass WHERE Name LIKE '%Test%'" --target-org my-sandbox

Permission Errors

Ensure user has "Author Apex" permission and API access.

Async Test Not Completing

Check system status:

sf apex get test \
  --test-run-id 707xx0000000000AAA \
  --target-org my-sandbox