PowerShell Pester Examples: Mastering Unit Testing for Flawless Code!

PowerShell Pester is a powerful testing framework for PowerShell scripts, modules, and functions. In this article, we explore the fundamentals of Pester and provide hands-on examples to demonstrate its capabilities. Learn how to write unit tests, integration tests, and mock dependencies using Pester, empowering you to create robust and reliable PowerShell code.

How to Install Pester?

To install Pester, a popular testing framework for PowerShell, you can follow these steps:

  • Open a PowerShell session with administrative privileges.
  • Check if you have the PowerShellGet module installed by running the following command:
Get-Module -ListAvailable PowerShellGet
How to Install Pester? PowerShell Pester Examples: Mastering Unit Testing for Flawless Code!
  • If the module is listed, you can skip to step 4. Otherwise, continue to step 3.
  • Install the PowerShellGet module by running the following command:
Install-Module -Name PowerShellGet -Force -AllowClobber
How to Install Pester?
  • Install Pester by running the following command:
Install-Module -Name Pester -Force -AllowClobber
How to Install Pester?
  • If prompted to install the module from an untrusted repository, you can proceed by typing Y and pressing Enter.
  • Wait for the installation to complete. Pester and its dependencies will be downloaded and installed from the PowerShell Gallery.

Once the installation is finished, you can start using Pester to write and run tests for your PowerShell scripts and modules.

To verify that Pester is installed correctly, you can run the following command to display the installed module version:

Get-Module -ListAvailable -Name Pester
Pester installation verification

If the module version is displayed, it means Pester is successfully installed on your system.

Making PowerShell Pester Tests 

To create a PowerShell Pester test, you can follow these steps:

  • Open a text editor or an integrated development environment (IDE) that supports PowerShell scripting.
  • Create a new PowerShell script file with a .ps1 extension. For example, MyTestScript.ps1.
  • Import the Pester module at the beginning of your script by adding the following line:
Import-Module -Name Pester
  • Define your test script by using the Describe block. This block serves as the container for your tests and provides a description of the test scenario. For example:
Describe "MyTestScript" {
    # Tests will be added here
}
Making PowerShell Pester Tests 
  • Within the Describe block, use the It block to define individual test cases. Each It block represents a specific test and should contain an assertion to validate the expected behavior. For example:
Describe "MyTestScript" {
    It "Should return the correct result" {
        # Test code and assertions go here
    }
}
Making PowerShell Pester Tests 
  • Write the test code inside the It block to exercise the functionality being tested. This can include calling functions, cmdlets, or scripts and capturing the output.
  • Add assertions inside the It block to validate the expected behavior. Pester provides various assertion functions such as Should, Should Be, Should Not Be, etc. Use these functions to compare actual and expected values. For example:
  • Save the test script file.
  • Open a PowerShell session and navigate to the directory where your test script is saved.
  • Run the Pester tests by executing the following command:
Invoke-Pester -Path .\MyTestScript.ps1
Making PowerShell Pester Tests 

Pester will execute the tests defined in your script and provide feedback on whether the tests pass or fail. It will display detailed information about each test, including any assertions that failed.

Note: Make sure that the script you are testing is available and accessible to the Pester script. If needed, you can use the Import-Module or Dot-Source the script within your Pester test script to make its functions or cmdlets available for testing.

Executing Pester Tests

To run the Pester test script using PowerShell, you can follow these steps:

  • Open a PowerShell session.
  • Navigate to the directory where your Pester test script is saved. Use the cd command to change the directory. For example: cd C:\Path\To\Your\TestScriptDirectory
  • Run the Pester tests by executing the following command:
Invoke-Pester -Path .\MyTestScript.ps1
Executing Pester Tests
  • Replace .\<YourTestScript> with the actual name of your test script file. If your test script is located in a subdirectory, provide the relative or absolute path to the script file.
  • The Invoke-Pester cmdlet will run the tests defined in the specified script file and display the test results in the PowerShell console.
  • If the tests pass, you will see a summary indicating that all tests have passed. If any tests fail, the failure details will be displayed, highlighting the specific assertions that did not meet the expected behavior.
  • You can also use additional parameters with the Invoke-Pester cmdlet to customize the test execution, such as -OutputFile to save the test results to a file, -Tag to run specific tests with certain tags, and more. Refer to the Pester documentation for more details on available options.

By following these steps, you can run your Pester test script using PowerShell and validate the behavior of your PowerShell code.

Generating a Passing Pester Test

To write a passing Pester test, follow these steps:

  • Open a text editor or integrated development environment (IDE) to create a new PowerShell script file.
  • Import the Pester module at the beginning of your script by adding the following line: Import-Module Pester
  • Define a Describe block to group related tests together. Inside the Describe block, use Context or It blocks to define individual test cases. For example:
Describe "Math functions" {
    Context "Addition" {
        It "Adds two numbers correctly" {
            $result = 2 + 3
            $result | Should -Be 5
        }
    }

    Context "Subtraction" {
        It "Subtracts two numbers correctly" {
            $result = 5 - 3
            $result | Should -Be 2
        }
    }
}
Generating a Passing Pester Test
  • In this example, we have a Describe block named “Math functions” that contains two nested Context blocks for addition and subtraction. Each It block defines a specific test case, performing the desired calculations and using the Should assertion to verify the expected result.
  • Save the script file with a .ps1 extension (e.g., MyTestScript.ps1).
  • Open a PowerShell session and navigate to the directory where the script file is located.
  • Run the Pester test by executing the following command:
Invoke-Pester -Path .\MyTestScript.ps1
Generating a Passing Pester Test
  • Replace .\<YourTestScript> with the actual name of your test script file. If your test script is located in a subdirectory, provide the relative or absolute path to the script file.
  • The output will show the test results. If all tests pass, you will see a summary indicating that all tests have passed.

Understanding the Executed Pester Test

When you run a PowerShell test using Pester, here’s how it works:

  • Pester initializes and sets up the testing environment.
  • Pester reads the PowerShell script file containing the tests.
  • Pester executes the Describe blocks in the script. Each Describe block represents a grouping of related tests.
  • Within each Describe block, Pester executes the Context and It blocks. The Context blocks further group the tests within the Describe block, while the It blocks define the individual test cases.
  • Pester runs each test case defined in the It blocks sequentially. It executes the code inside the It block to perform the desired operations or calculations.
  • Inside each It block, Pester uses the Should assertion to compare the actual result of the code execution with the expected result. If the actual result matches the expected result, the test passes. Otherwise, the test fails.
  • As each test case is executed, Pester captures the test results and provides feedback in the console output. It reports whether each test has passed or failed, along with any additional information or error messages.
  • Once all the tests have been executed, Pester generates a summary report indicating the overall test results. It shows the total number of tests run, the number of passing and failing tests, and any additional information or statistics.

By following this process, Pester allows you to define and run tests for your PowerShell code, verifying that it behaves as expected and producing the desired results. It provides a structured framework for organizing and executing tests, making it easier to maintain and validate the correctness of your PowerShell scripts.

Pester Blocks and their Roles

In Pester, there are three main types of blocks used to structure and organize tests:

Describe Block:

  • The Describe block is used to group related tests together.
  • It provides a context or scenario in which the tests are executed.
  • It helps in organizing and understanding the purpose of the tests.
  • Multiple Describe blocks can be nested to create a hierarchical structure.
  • Example:
Describe "Math functions" {
    # Tests for math functions go here
}
Describe Block

Context Block:

  • The Context block is optional and is used to further categorize or refine the tests within a Describe block.
  • It provides additional context or conditions under which the tests are executed.
  • It helps in grouping related tests based on different scenarios or configurations.
  • Multiple Context blocks can be nested within a Describe block.
  • Example:
Describe "Math functions" {
    Context "Addition" {
        # Tests for addition go here
    }

    Context "Subtraction" {
        # Tests for subtraction go here
    }
}
Context Block:

It Block:

  • The It block defines an individual test case.
  • It contains the code that performs the operations or calculations to be tested.
  • It uses the Should assertion to compare the actual result with the expected result.
  • It provides the pass or fail outcome of the test.
  • Multiple It blocks can be defined within a Describe or Context block.
  • Example:
Describe "Math functions" {
    Context "Addition" {
        It "should return the correct sum" {
            $result = Add-Numbers 2 3
            $result | Should -Be 5
        }
    }

    Context "Subtraction" {
        It "should return the correct difference" {
            $result = Subtract-Numbers 5 3
            $result | Should -Be 2
        }
    }
}
It Block

By using these blocks, you can structure your tests in a logical and readable manner, making it easier to organize, understand, and maintain your test suites. Each block serves a specific purpose in grouping and defining the tests, allowing you to effectively validate the behavior and correctness of your PowerShell code.

With the knowledge and practical examples of PowerShell Pester in your arsenal, you are well-equipped to write high-quality and resilient PowerShell scripts. By incorporating Pester into your development workflow, you can ensure the integrity and stability of your codebase, ultimately delivering more reliable and efficient solutions. Elevate your PowerShell scripting with Pester and take your automation to the next level.

Meet the Author

Abdul Rahim has been working in Information Technology for over two decades. Learn how Abdul got his start as a Tech Blogger , and why he decided to start this Software blog. If you want to send Abdul a quick message, then visit his contact page here.