PHPackages                             conoredwardscp/pest-plugin-qase - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. conoredwardscp/pest-plugin-qase

AbandonedArchivedLibrary[Framework](/categories/framework)

conoredwardscp/pest-plugin-qase
===============================

Qase TMS reporter plugin for Pest

v1.0.3(5mo ago)016MITPHPPHP ^8.2.0

Since Nov 13Pushed 2mo agoCompare

[ Source](https://github.com/ConorEdwardsCP/pest-plugin-qase)[ Packagist](https://packagist.org/packages/conoredwardscp/pest-plugin-qase)[ RSS](/packages/conoredwardscp-pest-plugin-qase/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (4)Dependencies (4)Versions (6)Used By (0)

This project is no longer going to be maintained. Qase has implemented their own Pest plugin and that should be used instead.

Pest Qase Plugin
================

[](#pest-qase-plugin)

**Seamlessly integrate your Pest tests with Qase Test Management System**

[![Latest Version on Packagist](https://camo.githubusercontent.com/71eafd7aa0afb0416adbe7c4ee66dd37ab15509a5190412e416745ec39746a37/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f636f6e6f726564776172647363702f706573742d706c7567696e2d716173652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/conoredwardscp/pest-plugin-qase)[![Total Downloads](https://camo.githubusercontent.com/61718ba278abdac73e6540474e690c5bf5eb74b959e13cc2c4e0f9bc4c4f489f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f636f6e6f726564776172647363702f706573742d706c7567696e2d716173652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/conoredwardscp/pest-plugin-qase)[![License](https://camo.githubusercontent.com/2519994fb081aab779a79c1f4bb70017065d22390302f0e2579e532eaf813246/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f636f6e6f726564776172647363702f706573742d706c7567696e2d716173652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/conoredwardscp/pest-plugin-qase)

What is it?
-----------

[](#what-is-it)

The Pest Qase Plugin is a powerful integration that automatically reports your Pest test results to [Qase TMS](https://qase.io/). Track test execution, manage test cases, and maintain comprehensive test documentation—all without leaving your testing workflow.

### Why use it?

[](#why-use-it)

✨ **Automatic Reporting** — Test results flow directly to Qase TMS after each run

🔗 **Easy Linking** — Connect tests to Qase test cases with a simple `caseId()` call

📊 **Rich Metadata** — Add custom fields, parameters, comments, and attachments

🎯 **Smart Organization** — Group tests into suites for better management

⚡ **Parallel Execution** — Fully supports concurrent test runs

Requirements
------------

[](#requirements)

- PHP 8.2 or higher
- Pest 3.0 or 4.0
- A [Qase](https://qase.io/) account with an API token

Installation
------------

[](#installation)

Install the plugin via Composer:

```
composer require conoredwardscp/pest-plugin-qase --dev
```

Then, register the extension in your `phpunit.xml`:

```

```

Configuration
-------------

[](#configuration)

Configure the plugin using environment variables. You can set these in your `.env` file, CI/CD pipeline, or export them in your terminal:

```
# Required: Set the reporting mode
QASE_MODE=testops  # Options: testops, report, off

# Required: Your Qase API token
QASE_TESTOPS_API_TOKEN=your_api_token_here

# Required: Your Qase project code
QASE_TESTOPS_PROJECT=PROJECT_CODE

# Optional: Link results to an existing test run
QASE_TESTOPS_RUN_ID=123

# Optional: Set a custom test run title
QASE_TESTOPS_RUN_TITLE="My Test Run"

# Optional: For parallel execution (automatically set by most test runners)
TEST_TOKEN=thread_identifier
```

> **💡 Tip:** Get your API token from your Qase account settings, and find your project code in the project URL or settings.

Usage
-----

[](#usage)

### Basic Test Case Linking

[](#basic-test-case-linking)

Link a Pest test to a Qase test case by its ID:

```
it('validates user login', function () {
    qase()->caseId(123);

    $user = loginUser('test@example.com', 'password');

    expect($user)->toBeLoggedIn();
});
```

### Multiple Test Case IDs

[](#multiple-test-case-ids)

One test can report to multiple Qase test cases:

```
it('validates complex authentication flow', function () {
    qase()->caseId(101, 102, 103);

    // Your test code here
});
```

### Organizing with Suites

[](#organizing-with-suites)

Group related tests using suites for better organization:

```
it('validates user authentication', function () {
    qase()
        ->suite('Authentication')
        ->suite('Security')
        ->caseId(200);

    // Your test code here
});
```

### Adding Custom Fields

[](#adding-custom-fields)

Enhance your test results with custom metadata:

```
it('checks critical API endpoint', function () {
    qase()
        ->caseId(300)
        ->field('severity', 'critical')
        ->field('priority', 'high')
        ->field('layer', 'api');

    // Your test code here
});
```

### Adding Parameters

[](#adding-parameters)

Track test parameters for better context:

```
it('validates cross-browser compatibility', function () {
    qase()
        ->caseId(400)
        ->parameter('browser', 'chrome')
        ->parameter('environment', 'staging')
        ->parameter('viewport', '1920x1080');

    // Your test code here
});
```

### Custom Test Titles

[](#custom-test-titles)

Override the default test name with a custom title:

```
it('tc_auth_001_validates_login_with_valid_credentials', function () {
    qase()
        ->caseId(500)
        ->title('User Login with Valid Credentials');

    // Your test code here
});
```

### Adding Comments

[](#adding-comments)

Add runtime comments to your test results for additional context:

```
it('performs data migration', function () {
    qase()->caseId(600);

    qase()->comment('Starting migration of 10,000 records');

    $result = migrateData();

    qase()->comment('Migration completed successfully');
    qase()->comment('Total time: ' . $result->duration . ' seconds');

    expect($result->success)->toBeTrue();
});
```

### Adding Attachments

[](#adding-attachments)

Attach files or content directly to your test results:

```
it('generates user report', function () {
    qase()->caseId(700);

    $report = generateReport();

    // Attach a single file
    qase()->attach('/path/to/screenshot.png');

    // Attach multiple files
    qase()->attach([
        '/path/to/log.txt',
        '/path/to/report.pdf'
    ]);

    // Attach content directly
    qase()->attach((object)[
        'title' => 'api-response.json',
        'content' => json_encode($report),
        'mime' => 'application/json'
    ]);

    expect($report)->toBeValid();
});
```

### Fluent API Chaining

[](#fluent-api-chaining)

Chain multiple methods together for clean, readable test setup:

```
it('validates complete user journey', function () {
    qase()
        ->caseId(800)
        ->suite('Integration Tests')
        ->suite('User Journey')
        ->field('severity', 'high')
        ->field('priority', 'critical')
        ->parameter('environment', 'production')
        ->parameter('user_type', 'premium')
        ->title('Complete Premium User Journey');

    // Your test code here
});
```

### Working with Data Providers

[](#working-with-data-providers)

The plugin automatically handles PHPUnit data providers:

```
it('validates different user roles', function ($role, $permissions) {
    qase()
        ->caseId(900)
        ->parameter('role', $role)
        ->parameter('permissions', implode(',', $permissions));

    $user = createUserWithRole($role);

    expect($user->permissions)->toBe($permissions);
})->with([
    ['admin', ['read', 'write', 'delete']],
    ['editor', ['read', 'write']],
    ['viewer', ['read']],
]);
```

### Parallel Test Execution

[](#parallel-test-execution)

The plugin is fully thread-safe and supports parallel execution out of the box:

```
# Pest parallel execution
./vendor/bin/pest --parallel

# With custom process count
./vendor/bin/pest --parallel --processes=4
```

API Reference
-------------

[](#api-reference)

### Global Helper

[](#global-helper)

**`qase()`**Returns the Qase instance for the current test.

### Available Methods

[](#available-methods)

All methods return `self` for method chaining.

#### `caseId(int ...$ids): self`

[](#caseidint-ids-self)

Link the test to one or more Qase test case IDs.

```
qase()->caseId(123);           // Single ID
qase()->caseId(123, 456, 789); // Multiple IDs
```

#### `suite(string ...$suites): self`

[](#suitestring-suites-self)

Add one or more suites to organize the test.

```
qase()->suite('Authentication');
qase()->suite('API', 'Integration', 'Smoke');
```

#### `field(string $name, string $value): self`

[](#fieldstring-name-string-value-self)

Add a custom field to the test result.

```
qase()->field('severity', 'critical');
qase()->field('priority', 'high');
```

#### `parameter(string $name, string $value): self`

[](#parameterstring-name-string-value-self)

Add a parameter to the test result.

```
qase()->parameter('browser', 'chrome');
qase()->parameter('environment', 'staging');
```

#### `title(string $title): self`

[](#titlestring-title-self)

Set a custom title for the test result.

```
qase()->title('User Login with Valid Credentials');
```

#### `comment(string $message): void`

[](#commentstring-message-void)

Add a comment to the test result during execution.

```
qase()->comment('Starting validation phase');
qase()->comment('Validation completed successfully');
```

#### `attach(mixed $input): void`

[](#attachmixed-input-void)

Add an attachment to the test result.

```
// Single file path
qase()->attach('/path/to/file.png');

// Multiple file paths
qase()->attach(['/path/to/file1.txt', '/path/to/file2.json']);

// Content object
qase()->attach((object)[
    'title' => 'filename.txt',
    'content' => 'file contents',
    'mime' => 'text/plain'
]);
```

Development
-----------

[](#development)

### Running Tests

[](#running-tests)

```
# Run all tests
composer test

# Run specific test suites
composer test:unit      # Unit tests
composer test:lint      # Code style checks
composer test:types     # Static analysis
```

### Code Quality

[](#code-quality)

```
# Fix code style
composer lint

# Run refactoring
composer refacto
```

License
-------

[](#license)

Pest Qase Plugin is open-sourced software licensed under the [MIT license](LICENSE.md).

Links
-----

[](#links)

- **[Pest Documentation](https://pestphp.com)** — Learn more about Pest
- **[Qase Documentation](https://qase.io/docs)** — Qase TMS documentation
- **[Pest Repository](https://github.com/pestphp/pest)** — Main Pest framework

---

Built with ❤️ by the Pest community

###  Health Score

39

—

LowBetter than 86% of packages

Maintenance79

Regular maintenance activity

Popularity6

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~8 days

Total

4

Last Release

153d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/48d9e4b3c0bafb02cb77cd1af9bca0469bf7a123d695a3687afca1459e8d7595?d=identicon)[ConorEdwardsCP](/maintainers/ConorEdwardsCP)

---

Top Contributors

[![nunomaduro](https://avatars.githubusercontent.com/u/5457236?v=4)](https://github.com/nunomaduro "nunomaduro (33 commits)")[![ConorEdwardsCP](https://avatars.githubusercontent.com/u/178174879?v=4)](https://github.com/ConorEdwardsCP "ConorEdwardsCP (28 commits)")[![owenvoke](https://avatars.githubusercontent.com/u/1899334?v=4)](https://github.com/owenvoke "owenvoke (14 commits)")[![GrahamCampbell](https://avatars.githubusercontent.com/u/2829600?v=4)](https://github.com/GrahamCampbell "GrahamCampbell (5 commits)")[![alexmartinfr](https://avatars.githubusercontent.com/u/19224681?v=4)](https://github.com/alexmartinfr "alexmartinfr (2 commits)")

---

Tags

phpplugintestingunitframeworktestpestreportertmsqase

### Embed Badge

![Health badge](/badges/conoredwardscp-pest-plugin-qase/health.svg)

```
[![Health](https://phpackages.com/badges/conoredwardscp-pest-plugin-qase/health.svg)](https://phpackages.com/packages/conoredwardscp-pest-plugin-qase)
```

###  Alternatives

[defstudio/pest-plugin-laravel-expectations

A plugin to add laravel tailored expectations to Pest

98548.9k4](/packages/defstudio-pest-plugin-laravel-expectations)[pestphp/pest-plugin-stressless

Stressless plugin for Pest

67792.6k16](/packages/pestphp-pest-plugin-stressless)[jonpurvis/lawman

A PestPHP Plugin to help with architecture testing SaloonPHP integrations

4027.7k8](/packages/jonpurvis-lawman)[spatie/pest-plugin-route-testing

Make sure all routes in your Laravel app are ok

13753.8k](/packages/spatie-pest-plugin-route-testing)[milroyfraser/pest-plugin-gwt

Given When Then(GWT) Plugin for Pest

10332.1k1](/packages/milroyfraser-pest-plugin-gwt)[ozzie/pest-plugin-nest

Nest Pest PHP tests for better organization and readability

2028.3k](/packages/ozzie-pest-plugin-nest)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
