7.9 KiB
Executable File
Testing Guidelines
Testing is a critical and required part of the PowerShell project.
The Microsoft PowerShell team created nearly 100,000 tests over the last 12 years which we run as part of the release process for Windows PowerShell. Having all of those tests available for the initial release of PowerShell was not feasible, and we have targeted those tests which we believe will provide us the ability to catch regressions in the areas which have had the largest changes for PowerShell. It is our intent to continue to release more and more of our tests until we have the coverage we need.
For creating new tests, please review the documents on how to create tests for PowerShell. There is a best practices document for writing Pester tests. When adding new tests, place them in the directories as outlined below.
CI System
We use AppVeyor as a continuous integration (CI) system for Windows and Travis CI for non-Windows platforms.
AppVeyor
In the README.md
at the top of the repo, you can see AppVeyor badge.
It indicates the last build status of master
branch.
Hopefully, it's green:
This badge is clickable; you can open corresponding build page with logs, artifacts, and tests results. From there you can easily navigate to the build history.
Travis CI
Travis CI works similarly to AppVeyor.
For Travis CI there will be multiple badges.
The badges indicate the last build status of master
branch for different platforms.
Hopefully, it's green:
This badge is clickable; you can open corresponding build page with logs, artifacts, and tests results. From there you can easily navigate to the build history.
Getting CI Results
CI System builds (AppVeyor and Travis CI) and runs tests on every pull request and provides quick feedback about it.
These green check boxes and red crosses are clickable as well. They will bring you to the corresponding page with details.
Test Frameworks
Pester
Our script-based test framework is Pester. This is the framework which we are using internally at Microsoft for new script-based tests, and a large number of the tests which are part of the PowerShell project have been migrated from that test base. Pester tests can be used to test most of PowerShell behavior (even some API operations can easily be tested in Pester).
Substantial changes were required, to get Pester executing on non-Windows systems. These changes are not yet in the official Pester code base. Some features of Pester may not be available or may have incorrect behavior. Please make sure to create issues in PowerShell/PowerShell (not Pester) for anything that you find.
Test Tags
The Pester framework allows Describe
blocks to be tagged, and our CI system relies on those tags to invoke our tests.
One of the following tags must be used:
CI
- this tag indicates that the tests in theDescribe
block will be executed as part of the CI/PR processFeature
- tests with this tag will not be executed as part of the CI/PR process, but they will be executed on a daily basis as part of acron
driven build. They indicate that the test will be validating more behavior, or will be using remote network resources (ex: package management tests)Scenario
- this tag indicates a larger scale test interacting with multiple areas of functionality and/or remote resources, these tests are also run daily.
Additionally, the tag:
SLOW
indicates that the test takes a somewhat longer time to execute (97% of ourCI
tests take 100ms or less), a test which takes longer than 1 second should be considered as a candidate for being taggedSlow
Requesting additional tests for a PR
In our CI systems, we normally run only run tests tagged with CI
. If in the first line of the last (most recent) commit description you add [Feature]
,
we will ensure that we will also run the tests tagged with Feature
. When you would want to do this:
- You have added or changed a
Feature
test. - A maintainer asks you to run the
Feature
tests. - Based on experience, you are confident that a maintainer will ask you to run the
Feature
tests.
xUnit
For those tests which are not easily run via Pester, we have decided to use xUnit as the test framework. Currently, we have a minuscule number of tests which are run by using xUnit.
Running tests outside of CI
When working on new features or fixes, it is natural to want to run those tests locally before making a PR. Two helper functions are part of the build.psm1 module to help with that:
Start-PSPester
will execute all Pester tests which are run by the CI systemStart-PSxUnit
will execute the available xUnit tests run by the CI system
Our CI system runs these as well; there should be no difference between running these on your dev system, versus in CI.
When running tests in this way, be sure that you have started PowerShell with -noprofile
as some tests will fail if the
environment is not the default or has any customization.
For example, to run all the Pester tests for CI (assuming you are at the root of the PowerShell repo):
Import-Module ./build.psm1
Start-PSPester
If you wish to run specific tests, that is possible as well:
Start-PSPester -Path test/powershell/engine/Api
Or a specific Pester test file:
Start-PSPester -Path test/powershell/engine/Api/XmlAdapter.Tests.ps1
What happens after your PR?
When your PR has successfully passed the CI test gates, your changes will be used to create PowerShell binaries which can be run in Microsoft's internal test frameworks. The tests that you created for your change and the library of historical tests will be run to determine if any regressions are present. If these tests find regressions, you'll be notified that your PR is not ready, and provided with enough information to investigate why the failure happened.
Test Layout
We have taken a functional approach to the layout of our Pester tests and you should place new tests in their appropriate location. If you are making a fix to a cmdlet in a module, the test belongs in the module directory. If you are unsure, you can make it part of your PR, or create an issue.
The current layout of tests is:
- test/powershell/engine
- test/powershell/engine/Api
- test/powershell/engine/Basic
- test/powershell/engine/ETS
- test/powershell/engine/Help
- test/powershell/engine/Logging
- test/powershell/engine/Module
- test/powershell/engine/ParameterBinding
- test/powershell/engine/Remoting
- test/powershell/engine/Runspace
- test/powershell/engine/Logging/MessageAnalyzer
- test/powershell/Host
- test/powershell/Host/ConsoleHost
- test/powershell/Host/TabCompletion
- test/powershell/Language
- test/powershell/Modules
- test/powershell/Provider
- test/powershell/SDK
- test/powershell/Security
- test/powershell/Language/Classes
- test/powershell/Language/Interop
- test/powershell/Language/Operators
- test/powershell/Language/Parser
- test/powershell/Language/Interop/DotNet
- test/powershell/Language/Scripting
- test/powershell/Language/Scripting/Debugging
- test/powershell/Language/Scripting/NativeExecution
- test/powershell/Modules/Microsoft.PowerShell.Archive
- test/powershell/Modules/Microsoft.PowerShell.Core
- test/powershell/Modules/Microsoft.PowerShell.Diagnostics
- test/powershell/Modules/Microsoft.PowerShell.Management
- test/powershell/Modules/Microsoft.PowerShell.Security
- test/powershell/Modules/Microsoft.PowerShell.Utility
- test/powershell/Modules/PSReadLine