Pester Test Execution Order CAN Matter!

My most recent update to my PowerShell module PSSpeedTest was to split its Pester test files into separate files for each individual public and private function (see this pull request). After all of the tests had been separated as desired, the test for private function Remove-iPerf3 was throwing a suspicious warning at the end of its execution and the test for Remove-SpeedTestServer was failing entirely. Enabling debug on the line in the function indicated by the stack trace showed permissions errors when attempting to access paths such as C:\ProgramData\chocolatey\lib\iperf3\tools and C:\ProgramData\chocolatey\lib\iperf3\tools\chocolateyinstall.ps1.

After wracking my brain for a few hours on this issue, I turned to the PowerShell Virtual User Group on Slack for assistance and the solution was much simpler than I had expected. (Thanks, @StevePJP for the help!)

A test for the function Install-SpeedTestServer is executed prior to those for both Remove-iPerf3 and Remove-SpeedTestServer; this test kicks off iperf3 as a process that listens for connections. The test for Remove-iPerf3 naturally attempts to remove the iperf3 package which fails as it is locked. The test for Remove-SpeedTestServer first tries to install iperf3 but fails since it is already installed and running.

Ensuring that the iperf3 process is stopped before removal allowed the test for Remove-iPerf to pass and consequently the test for Remove-SpeedTestServer also passed.

My tests are a bit of a mess right now and will be cleaned up. The reminder that test execution order can have profound impacts on one’s test/build environment was welcome.

Updated:

Comments