Test Selection

Test Selection allows you to intelligently run only the tests that are relevant to your code changes. By defining rules in a testery.yml file, you can automatically select which tests to run based on which source files have changed.

Overview

When you push code changes to your repository, Testery can analyze which files were modified and automatically determine which tests should run. This helps you:

  • Save time by running only relevant tests instead of your entire test suite

  • Get faster feedback on changes that affect specific features

  • Reduce costs by minimizing unnecessary test execution

  • Maintain confidence by ensuring related tests always run when code changes

How It Works

Test Selection uses rules defined in a testery.yml configuration file at the root of your repository. Each rule specifies:

  1. When to apply the rule (which source files trigger it)

  2. Then what tests to run (using tags or filters)

Testery compares your commit's changed files against these rules and selectively runs the appropriate tests.

Configuration

Basic Structure

Create a testery.yml file in your repository root with the following structure:

test_selection:
  suites:
    - default:
      rules:
        - ruleName:
          when:
            - src_changes:
                - pattern1
                - pattern2
          then:
            - include_tags:
                - tag1
                - tag2

Example Configuration

Here's a real-world example showing how to configure test selection rules:

test_selection:
  suites:
    - default:
      rules:
        - authenticationRule:
          when:
            - src_changes:
                - src/auth/**/*
                - src/login/**/*
          then:
            - include_tags:
                - authentication
                - login

        - paymentRule:
          when:
            - src_changes:
                - src/payment/**/*
                - src/checkout/**/*
          then:
            - include_tags:
                - payment
                - checkout

        - databaseRule:
          when:
            - src_changes:
                - src/repositories/**/*
                - src/models/**/*
          then:
            - test_filters:
                - Tests.Integration.Database.*

Rule Components

When Conditions

The when section defines which file changes should trigger the rule. Currently supported:

src_changes

Specifies file path patterns to watch for changes. Supports two pattern types:

Glob Patterns (default):

when:
  - src_changes:
      - src/**/*.js           # All JavaScript files in src
      - components/**/*.tsx   # All TypeScript React files
      - config/*.json         # JSON files in config directory

Regex Patterns: Prefix with regex: to use regular expressions:

when:
  - src_changes:
      - regex: .*Grid\.[a-z0-9]+  # Files containing "Grid" with any extension
      - regex: ^src/.*Test\.cs$   # C# test files in src directory

Then Actions

The then section defines which tests to run when the rule matches. You can use:

include_tags

Run tests with specific tags:

then:
  - include_tags:
      - smoke
      - critical

exclude_tags

Exclude tests with specific tags:

then:
  - exclude_tags:
      - slow
      - flaky

test_filters

Run tests matching specific name patterns:

then:
  - test_filters:
      - MyApp.Tests.Unit.*
      - MyApp.Tests.Integration.Auth.*

Multiple Rules

You can define multiple rules, and Testery will combine the results. If your changes match multiple rules, all matching tests will be selected (union behavior).

test_selection:
  suites:
    - default:
      rules:
        - frontendRule:
          when:
            - src_changes:
                - frontend/**/*
          then:
            - include_tags:
                - ui
                - e2e

        - backendRule:
          when:
            - src_changes:
                - backend/**/*
          then:
            - include_tags:
                - api
                - integration

        - sharedRule:
          when:
            - src_changes:
                - shared/**/*
          then:
            - include_tags:
                - ui
                - api

If changes are made to both frontend/ and shared/ files, tests tagged with ui, e2e, and api will all run.

Best Practices

1. Start with Broad Rules

Begin with high-level rules covering major components:

rules:
  - uiRule:
    when:
      - src_changes:
          - src/components/**/*
    then:
      - include_tags:
          - ui

2. Add Specific Rules for Critical Paths

Create targeted rules for high-risk areas:

rules:
  - paymentProcessingRule:
    when:
      - src_changes:
          - src/payment/processor.ts
    then:
      - include_tags:
          - payment
          - critical

3. Use Regex for Complex Patterns

When glob patterns aren't sufficient, use regex:

rules:
  - generatedFilesRule:
    when:
      - src_changes:
          - regex: .*\.generated\.(ts|js)$
    then:
      - include_tags:
          - generated-code

4. Combine Tags and Filters

Use both tags and filters for fine-grained control:

rules:
  - databaseMigrationRule:
    when:
      - src_changes:
          - migrations/**/*
    then:
      - include_tags:
          - database
      - test_filters:
          - Tests.Migrations.*

5. Consider Dependencies

Include tests for code that depends on changed files:

rules:
  - coreLibraryRule:
    when:
      - src_changes:
          - lib/core/**/*
    then:
      - include_tags:
          - core
          - integration  # Run integration tests too

Enabling Test Selection

To enable test selection for a test run:

  1. Add a testery.yml file to your repository with test selection rules

  2. Ensure your tests are tagged appropriately

  3. Enable the "Apply Test Selection Rules" option when creating or configuring your test run in Testery

When test selection is enabled and rules are configured, Testery will:

  1. Detect which files changed in your commit

  2. Evaluate your test selection rules

  3. Identify which rules match the changed files

  4. Run only the tests specified by the matching rules

Common Patterns

Running All Tests for Specific Files

rules:
  - configChangeRule:
    when:
      - src_changes:
          - config/**/*
          - *.config.js
    then:
      - include_tags:
          - all

Framework-Specific Patterns

Pytest:

rules:
  - pytestRule:
    when:
      - src_changes:
          - src/**/*.py
    then:
      - test_filters:
          - tests/unit/test_*.py

NUnit:

rules:
  - nunitRule:
    when:
      - src_changes:
          - src/**/*.cs
    then:
      - test_filters:
          - MyApp.Tests.Unit.*

Cypress:

rules:
  - cypressRule:
    when:
      - src_changes:
          - src/components/**/*
    then:
      - include_tags:
          - '@component-tests'

Troubleshooting

No Tests Running

If no tests run when you expect them to:

  1. Check that your testery.yml is in the repository root

  2. Verify file patterns match your actual file paths

  3. Ensure tags in rules match tags on your tests

  4. Check that "Apply Test Selection Rules" is enabled for your test run

Too Many Tests Running

If more tests run than expected:

  1. Review your patterns for overly broad matches

  2. Use more specific glob patterns or regex

  3. Consider using exclude_tags to filter out tests

  4. Check that multiple rules aren't combining unexpectedly

Pattern Not Matching

If patterns don't seem to match your files:

  1. Verify file paths are relative to repository root

  2. Test glob patterns (they're case-sensitive)

  3. For regex patterns, ensure the regex: prefix is present

  4. Check that special characters are properly escaped

See Also

  • Tags - Learn about tagging your tests

  • Test Runs - Creating and configuring test runs

  • Projects - Configuring your Testery projects

Last updated

Was this helpful?