---
title: Test Frameworks
description: Set up your test framework to report its results to Test Engine, with a Mergify plugin or a JUnit XML report.
---

Test Engine builds each test's history from the results your CI runs report.
Pick your framework below: its page shows the setup, from the package to
install to the CI step that sends the results. A framework reports in one of
two ways:

- **Plugin** runs inside your tests: a Mergify package sends the results when
  the run ends and applies [quarantine](/test-engine/quarantine) in the run. On
  pull requests, it reruns new tests to catch flaky ones before they merge
  ([Prevention](/test-engine/prevention)).

- **JUnit report** is uploaded after the run: the framework writes a JUnit XML
  file, then a CI step uploads it and applies quarantine, so the job fails only
  on failures that are not quarantined. No reruns: Prevention needs a plugin.

## JavaScript and TypeScript

- [Bun](/test-engine/test-frameworks/bun): JUnit report, `bun test --reporter=junit`
- [Cypress](/test-engine/test-frameworks/cypress): JUnit report, `mocha-junit-reporter`
- [Deno](/test-engine/test-frameworks/deno): JUnit report, `deno test --junit-path`
- [Jasmine](/test-engine/test-frameworks/jasmine): JUnit report, `jasmine-reporters`
- [Jest](/test-engine/test-frameworks/jest): Plugin, `@mergifyio/jest`
- [Karma](/test-engine/test-frameworks/karma): JUnit report, `karma-junit-reporter`
- [Mocha](/test-engine/test-frameworks/mocha): Plugin, `@mergifyio/mocha`
- [Nightwatch](/test-engine/test-frameworks/nightwatch): JUnit report, `built-in JUnit report`
- [Node.js test runner](/test-engine/test-frameworks/node-test): JUnit report, `--test-reporter=junit`
- [Playwright](/test-engine/test-frameworks/playwright): Plugin, `@mergifyio/playwright`
- [Vitest](/test-engine/test-frameworks/vitest): Plugin, `@mergifyio/vitest`
- [WebdriverIO](/test-engine/test-frameworks/webdriverio): JUnit report, `@wdio/junit-reporter`

## Python

- [Behave](/test-engine/test-frameworks/behave): JUnit report, `behave --junit`
- [pytest](/test-engine/test-frameworks/pytest): Plugin, `pytest-mergify`
- [Robot Framework](/test-engine/test-frameworks/robot-framework): JUnit report, `robot --xunit`
- [unittest and Django](/test-engine/test-frameworks/unittest): JUnit report, `unittest-xml-reporting`

## Ruby

- [Minitest](/test-engine/test-frameworks/minitest): Plugin, `minitest-mergify`
- [RSpec](/test-engine/test-frameworks/rspec): Plugin, `rspec-mergify`

## Java and the JVM

- [Android](/test-engine/test-frameworks/android): JUnit report, `Android Gradle plugin`
- [JUnit](/test-engine/test-frameworks/junit): JUnit report, `Maven Surefire or Gradle`
- [Kotest](/test-engine/test-frameworks/kotest): JUnit report, `Gradle test reports`
- [TestNG](/test-engine/test-frameworks/testng): JUnit report, `JUnitReportReporter`

## .NET

- [MSTest](/test-engine/test-frameworks/mstest): JUnit report, `JunitXml.TestLogger`
- [NUnit](/test-engine/test-frameworks/nunit): JUnit report, `JunitXml.TestLogger`
- [xUnit.net](/test-engine/test-frameworks/xunit): JUnit report, `JunitXml.TestLogger or --report-xunit-junit`

## PHP

- [Pest](/test-engine/test-frameworks/pest): JUnit report, `--log-junit`
- [PHPUnit](/test-engine/test-frameworks/phpunit): JUnit report, `--log-junit`

## Go

- [Ginkgo](/test-engine/test-frameworks/ginkgo): JUnit report, `ginkgo --junit-report`
- [Go](/test-engine/test-frameworks/golang): JUnit report, `go-junit-report or gotestsum`

## Rust

- [Rust](/test-engine/test-frameworks/rust): JUnit report, `cargo-nextest`

## C and C++

- [CTest](/test-engine/test-frameworks/ctest): JUnit report, `ctest --output-junit`
- [GoogleTest](/test-engine/test-frameworks/googletest): JUnit report, `--gtest_output`

## Swift

- [Swift Testing](/test-engine/test-frameworks/swift-testing): JUnit report, `swift test --xunit-output`
- [XCTest](/test-engine/test-frameworks/xctest): JUnit report, `swift test or xcbeautify`

## Dart

- [Dart](/test-engine/test-frameworks/dart): JUnit report, `junitreport`
- [Flutter](/test-engine/test-frameworks/flutter): JUnit report, `junitreport`

## Elixir

- [ExUnit](/test-engine/test-frameworks/exunit): JUnit report, `junit_formatter`

## Multiple languages

- [Bazel](/test-engine/test-frameworks/bazel): JUnit report, `bazel test`
- [Cucumber](/test-engine/test-frameworks/cucumber): JUnit report, `JUnit formatter`

## Other frameworks

If your framework is not listed but can write a JUnit XML report, follow the
upload steps on any JUnit report page, such as
[JUnit](/test-engine/test-frameworks/junit), and point them at your report:
`report_path` in the GitHub Actions and Buildkite steps, or the last argument
of `mergify ci junit-process`.
