Skip to content
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions AzureDevOps/DistributeTests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<#
.SYNOPSIS
Distribute the tests in VSTS pipeline across multiple agents
.DESCRIPTION
This script slices tests files across multiple agents for faster execution.
We search for specific type of file structure (in this example test*), and slice them according to agent number
If we encounter multiple files [file1..file10] and if we have 2 agents, agent1 executes tests odd number of files while agent2 executes even number of files
For detalied slicing info: https://docs.microsoft.com/en-us/vsts/pipelines/test/parallel-testing-any-test-runner
#>

$tests = Get-ChildItem .\tests\ -File # search for test files with specific pattern.
$totalAgents = [int]$Env:SYSTEM_TOTALJOBSINPHASE # standard VSTS variables available using parallel execution; total number of parallel jobs running
$agentNumber = [int]$Env:SYSTEM_JOBPOSITIONINPHASE # current job position
$testCount = $tests.Count

# below conditions are used if parallel pipeline is not used. i.e. pipeline is running with single agent (no parallel configuration)
if ($totalAgents -eq 0) {
$totalAgents = 1
}
if (!$agentNumber -or $agentNumber -eq 0) {
$agentNumber = 1
}

Write-Host "Total agents: $totalAgents"
Write-Host "Agent number: $agentNumber"
Write-Host "Total tests: $testCount"

$testsToRun= @()

# slice test files to make sure each agent gets unique test file to execute
For ($i=$agentNumber; $i -le $testCount;) {
$file = $tests[$i-1]

$fileName = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
$testsToRun += "$fileName/*"
Write-Host "Added $file"
$i = $i + $totalAgents
}

# join all test files seperated by space.
$testFiles = $testsToRun -Join " "
Write-Host "Test files $testFiles"
# write these files into variable so that we can run them using pytest in subsequent task.
Write-Host "##vso[task.setvariable variable=MATLABTestFiles;]$testFiles"
52 changes: 52 additions & 0 deletions AzureDevOps/DistributeTests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/bin/bash
#===============================================================================
#
# FILE: distribute_tests.sh
#
# USAGE: ./distribute_tests.sh
#
# DESCRIPTION: This script slices tests files across multiple agents for faster execution.
# We search for specific type of file structure (in this example test*), and slice them according to agent number
# If we encounter multiple files [file1..file10] and if we have 2 agents, agent1 executes tests odd number of files while agent2 executes even number of files
#
#===============================================================================

tests=()
while IFS= read -r file; do
tests+=("$file")
done < <(find ./tests -type f -name "*.m" | sort)

# Use Azure DevOps variables
totalAgents=${SYSTEM_TOTALJOBSINPHASE}
agentNumber=${SYSTEM_JOBPOSITIONINPHASE}
testCount=${#tests[@]}

if [ $totalAgents -eq 0 ]; then
totalAgents=1
fi
# below conditions are used if parallel pipeline is not used. i.e. pipeline is running with single agent (no parallel configuration)
if [ -z $agentNumber ]; then
agentNumber=1
fi

echo "Total agents: $totalAgents"
echo "Agent number: $agentNumber"
echo "Total tests: $testCount"

testsToRun=()

# Slice test files so each agent gets unique files (1-based index)
for (( i=agentNumber; i<=testCount; i+=totalAgents )); do
file="${tests[i-1]}"

fileName=$(basename "$file" .m)
testsToRun+=("${fileName}/*")
echo "Added $fileName"
done

# Join all test files separated by space
testFiles="${testsToRun[*]}"
echo "Test files $testFiles"

# Set as Azure Pipelines variable
echo "##vso[task.setvariable variable=MATLABTestFiles;]$testFiles"
85 changes: 85 additions & 0 deletions AzureDevOps/ParallelStrategy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
jobs:
- job: ParallelWindows
# Parallel strategy to run tests in parallel
strategy:
parallel: 2
pool:
vmImage: windows-latest
steps:
# Install MATLAB and required products
- task: InstallMATLAB@1
inputs:
products: MATLAB_Compiler_SDK MATLAB_Test

- task: RunMATLABBuild@1
inputs:
tasks: equivalenceTest
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)
Comment on lines 14 to 18
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aren't these tests being split and run again below?

Copy link
Member Author

@Vahila Vahila Nov 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tests needs some artifacts which are generated by a task in buildfile. I updated the task to 'buildPythonPackage' which generates the artifact.


- powershell: .\AzureDevOps\DistributeTests.ps1
displayName: 'PowerShell Script to distribute tests'

- task: RunMATLABTests@1
inputs:
selectByName: $(MATLABTestFiles)
sourceFolder: src
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- job: ParallelLinux
# Parallel strategy to run tests in parallel
strategy:
parallel: 2
pool:
vmImage: ubuntu-latest
steps:
# Install MATLAB and required products
- task: InstallMATLAB@1
inputs:
products: MATLAB_Compiler_SDK MATLAB_Test

# Builds Python package from MATLAB function and verifies functionality through equivalence tests
- task: RunMATLABBuild@1
inputs:
tasks: equivalenceTest
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- bash: chmod +x ./AzureDevOps/DistributeTests.sh && ./AzureDevOps/DistributeTests.sh
displayName: 'Bash Script to distribute tests'

- task: RunMATLABTests@1
inputs:
selectByName: $(MATLABTestFiles)
sourceFolder: src
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- job: ParallelMac
# Parallel strategy to run tests in parallel
strategy:
parallel: 2
pool:
vmImage: macOS-latest
steps:
# Install MATLAB and required products
- task: InstallMATLAB@1
inputs:
products: MATLAB_Compiler_SDK MATLAB_Test

- task: RunMATLABBuild@1
inputs:
tasks: equivalenceTest
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- bash: chmod +x ./AzureDevOps/DistributeTests.sh && ./AzureDevOps/DistributeTests.sh
displayName: 'Bash Script to distribute tests'

- task: RunMATLABTests@1
inputs:
selectByName: $(MATLABTestFiles)
sourceFolder: src
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)