- Fixed parameter conflicts in sf-data-export.ps1, sf-data-import.ps1, sf-retrieve.ps1, and sf-test-run.ps1 - Renamed conflicting \ parameter to \ to avoid conflicts with PowerShell's built-in -Verbose common parameter - Added proper parameter sets to ensure -Help parameter works correctly in all scripts - Added -hp aliases where needed for consistency across all scripts - All scripts now properly support help functionality without parameter conflicts This resolves issues where scripts would fail with 'A parameter with the name Verbose was defined multiple times' error.
257 lines
7.5 KiB
PowerShell
257 lines
7.5 KiB
PowerShell
#!/usr/bin/env pwsh
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Focused Apex test execution wrapper for Salesforce CLI
|
|
|
|
.DESCRIPTION
|
|
A user-friendly wrapper around 'sf apex run test' that simplifies test execution
|
|
with better formatting, intelligent defaults, and comprehensive reporting options.
|
|
|
|
.PARAMETER TestClasses
|
|
Comma-separated list of test class names to run
|
|
|
|
.PARAMETER TestMethods
|
|
Comma-separated list of specific test methods to run (format: ClassName.methodName)
|
|
|
|
.PARAMETER TestLevel
|
|
Test level to run (RunLocalTests, RunAllTestsInOrg, RunSpecifiedTests)
|
|
|
|
.PARAMETER Suite
|
|
Test suite name to run
|
|
|
|
.PARAMETER Coverage
|
|
Generate code coverage report
|
|
|
|
.PARAMETER Wait
|
|
Wait time in minutes for test execution (default: 10)
|
|
|
|
.PARAMETER o
|
|
Target org username or alias (uses default if not specified)
|
|
|
|
.PARAMETER OutputDir
|
|
Directory to store test results and reports
|
|
|
|
.PARAMETER VerboseOutput
|
|
Enable verbose test output
|
|
|
|
.PARAMETER Help
|
|
Show this help message
|
|
|
|
.EXAMPLE
|
|
.\sf-test-run.ps1 -TestClasses "AccountTest,ContactTest"
|
|
.\sf-test-run.ps1 -TestLevel "RunLocalTests" -Coverage
|
|
.\sf-test-run.ps1 -TestMethods "AccountTest.testCreate,ContactTest.testUpdate"
|
|
.\sf-test-run.ps1 -Suite "AllTests" -Wait 15 -o "staging"
|
|
|
|
.NOTES
|
|
This script automatically checks for Salesforce CLI installation and runs
|
|
diagnostics if the CLI is not found.
|
|
#>
|
|
|
|
param(
|
|
[Parameter(ParameterSetName="Classes")]
|
|
[string]$TestClasses,
|
|
|
|
[Parameter(ParameterSetName="Methods")]
|
|
[string]$TestMethods,
|
|
|
|
[Parameter(ParameterSetName="Level")]
|
|
[ValidateSet("RunLocalTests", "RunAllTestsInOrg", "RunSpecifiedTests")]
|
|
[string]$TestLevel,
|
|
|
|
[Parameter(ParameterSetName="Suite")]
|
|
[string]$Suite,
|
|
|
|
[Parameter(ParameterSetName="Classes")]
|
|
[Parameter(ParameterSetName="Methods")]
|
|
[Parameter(ParameterSetName="Level")]
|
|
[Parameter(ParameterSetName="Suite")]
|
|
[switch]$Coverage,
|
|
|
|
[Parameter(ParameterSetName="Classes")]
|
|
[Parameter(ParameterSetName="Methods")]
|
|
[Parameter(ParameterSetName="Level")]
|
|
[Parameter(ParameterSetName="Suite")]
|
|
[int]$Wait = 10,
|
|
|
|
[Parameter(ParameterSetName="Classes")]
|
|
[Parameter(ParameterSetName="Methods")]
|
|
[Parameter(ParameterSetName="Level")]
|
|
[Parameter(ParameterSetName="Suite")]
|
|
[string]$o,
|
|
|
|
[Parameter(ParameterSetName="Classes")]
|
|
[Parameter(ParameterSetName="Methods")]
|
|
[Parameter(ParameterSetName="Level")]
|
|
[Parameter(ParameterSetName="Suite")]
|
|
[string]$OutputDir,
|
|
|
|
[Parameter(ParameterSetName="Classes")]
|
|
[Parameter(ParameterSetName="Methods")]
|
|
[Parameter(ParameterSetName="Level")]
|
|
[Parameter(ParameterSetName="Suite")]
|
|
[switch]$VerboseOutput,
|
|
|
|
[Parameter(ParameterSetName="Help", Mandatory=$true)]
|
|
[Alias("hp")]
|
|
[switch]$Help
|
|
)
|
|
|
|
# Show help if requested
|
|
if ($Help) {
|
|
Get-Help $MyInvocation.MyCommand.Path -Detailed
|
|
exit 0
|
|
}
|
|
|
|
# Function to check if Salesforce CLI is installed
|
|
function Test-SalesforceCLI {
|
|
try {
|
|
$null = Get-Command sf -ErrorAction Stop
|
|
return $true
|
|
} catch {
|
|
return $false
|
|
}
|
|
}
|
|
|
|
# Function to run sf-check diagnostics
|
|
function Invoke-SalesforceCheck {
|
|
$checkScript = if (Test-Path "sf-check.ps1") {
|
|
".\sf-check.ps1"
|
|
} elseif (Test-Path "sf-check.sh") {
|
|
"bash sf-check.sh"
|
|
} else {
|
|
$null
|
|
}
|
|
|
|
if ($checkScript) {
|
|
Write-Host "Running Salesforce CLI diagnostics..." -ForegroundColor Yellow
|
|
Invoke-Expression $checkScript
|
|
} else {
|
|
Write-Host "Salesforce CLI not found and no diagnostic script available." -ForegroundColor Red
|
|
Write-Host "Please install the Salesforce CLI: https://developer.salesforce.com/tools/salesforcecli" -ForegroundColor Red
|
|
}
|
|
}
|
|
|
|
# Silently check for Salesforce CLI
|
|
if (-not (Test-SalesforceCLI)) {
|
|
Invoke-SalesforceCheck
|
|
exit 1
|
|
}
|
|
|
|
# Validate that at least one test specification is provided
|
|
$testSpecCount = @($TestClasses, $TestMethods, $TestLevel, $Suite | Where-Object { $_ }).Count
|
|
if ($testSpecCount -eq 0) {
|
|
Write-Host "Error: Must specify one of: -TestClasses, -TestMethods, -TestLevel, or -Suite" -ForegroundColor Red
|
|
Write-Host ""
|
|
Write-Host "Usage examples:" -ForegroundColor Yellow
|
|
Write-Host " .\sf-test-run.ps1 -TestClasses `"AccountTest,ContactTest`"" -ForegroundColor Gray
|
|
Write-Host " .\sf-test-run.ps1 -TestLevel `"RunLocalTests`" -Coverage" -ForegroundColor Gray
|
|
Write-Host " .\sf-test-run.ps1 -TestMethods `"AccountTest.testCreate`"" -ForegroundColor Gray
|
|
Write-Host " .\sf-test-run.ps1 -Suite `"AllTests`"" -ForegroundColor Gray
|
|
Write-Host ""
|
|
Write-Host "Use -Help for detailed usage information." -ForegroundColor Yellow
|
|
exit 1
|
|
}
|
|
|
|
# Build the sf command
|
|
$sfArgs = @("apex", "run", "test")
|
|
|
|
# Add test specification
|
|
if ($TestClasses) {
|
|
$sfArgs += "--class-names"
|
|
$sfArgs += $TestClasses
|
|
Write-Host "Running test classes: $TestClasses" -ForegroundColor Green
|
|
} elseif ($TestMethods) {
|
|
$sfArgs += "--tests"
|
|
$sfArgs += $TestMethods
|
|
Write-Host "Running test methods: $TestMethods" -ForegroundColor Green
|
|
} elseif ($TestLevel) {
|
|
$sfArgs += "--test-level"
|
|
$sfArgs += $TestLevel
|
|
Write-Host "Running tests at level: $TestLevel" -ForegroundColor Green
|
|
} elseif ($Suite) {
|
|
$sfArgs += "--suite-names"
|
|
$sfArgs += $Suite
|
|
Write-Host "Running test suite: $Suite" -ForegroundColor Green
|
|
}
|
|
|
|
# Add optional parameters
|
|
if ($o) {
|
|
$sfArgs += "--target-org"
|
|
$sfArgs += $o
|
|
Write-Host "Target org: $o" -ForegroundColor Cyan
|
|
}
|
|
|
|
if ($Wait -ne 10) {
|
|
$sfArgs += "--wait"
|
|
$sfArgs += $Wait.ToString()
|
|
}
|
|
|
|
if ($Coverage) {
|
|
$sfArgs += "--code-coverage"
|
|
Write-Host "Code coverage: Enabled" -ForegroundColor Yellow
|
|
}
|
|
|
|
if ($OutputDir) {
|
|
if (-not (Test-Path $OutputDir)) {
|
|
Write-Host "Creating output directory: $OutputDir" -ForegroundColor Yellow
|
|
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
|
|
}
|
|
$sfArgs += "--output-dir"
|
|
$sfArgs += $OutputDir
|
|
}
|
|
|
|
# Always use detailed output for better reporting
|
|
$sfArgs += "--detailed-coverage"
|
|
$sfArgs += "--result-format"
|
|
$sfArgs += "human"
|
|
|
|
# Add verbose flag if requested
|
|
if ($VerboseOutput) {
|
|
$sfArgs += "--verbose"
|
|
}
|
|
|
|
# Display test execution info
|
|
Write-Host ""
|
|
Write-Host "🧪 Starting Apex Test Execution" -ForegroundColor Blue
|
|
Write-Host "================================" -ForegroundColor Blue
|
|
|
|
# Display the command being run
|
|
Write-Host ""
|
|
Write-Host "Executing: sf $($sfArgs -join ' ')" -ForegroundColor Gray
|
|
Write-Host ""
|
|
|
|
# Execute the command
|
|
try {
|
|
$startTime = Get-Date
|
|
& sf @sfArgs
|
|
$exitCode = $LASTEXITCODE
|
|
$endTime = Get-Date
|
|
$duration = $endTime - $startTime
|
|
|
|
Write-Host ""
|
|
Write-Host "⏱️ Test execution completed in $($duration.TotalSeconds.ToString('F1')) seconds" -ForegroundColor Gray
|
|
|
|
if ($exitCode -eq 0) {
|
|
Write-Host ""
|
|
Write-Host "✅ Tests completed successfully!" -ForegroundColor Green
|
|
|
|
if ($Coverage) {
|
|
Write-Host "📊 Code coverage report generated" -ForegroundColor Yellow
|
|
}
|
|
|
|
if ($OutputDir) {
|
|
Write-Host "📁 Results saved to: $OutputDir" -ForegroundColor Cyan
|
|
}
|
|
} else {
|
|
Write-Host ""
|
|
Write-Host "❌ Test execution failed with exit code: $exitCode" -ForegroundColor Red
|
|
Write-Host "💡 Check test failures above for details" -ForegroundColor Yellow
|
|
exit $exitCode
|
|
}
|
|
} catch {
|
|
Write-Host "Error executing sf command: $($_.Exception.Message)" -ForegroundColor Red
|
|
exit 1
|
|
}
|