wbotelhos/rspeed

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# RSpeed

[![CI](https://github.com/wbotelhos/rspeed/workflows/CI/badge.svg)](https://github.com/wbotelhos/rspeed/actions)
[![Gem Version](https://badge.fury.io/rb/rspeed.svg)](https://badge.fury.io/rb/rspeed)
[![Maintainability](https://api.codeclimate.com/v1/badges/f312587b4f126bb13e85/maintainability)](https://codeclimate.com/github/wbotelhos/rspeed/maintainability)
[![Coverage](https://codecov.io/gh/wbotelhos/rspeed/branch/main/graph/badge.svg)](https://codecov.io/gh/wbotelhos/rspeed)
[![Sponsor](https://img.shields.io/badge/sponsor-%3C3-green)](https://www.patreon.com/wbotelhos)

RSpeed splits your specs to you run parallels tests.

## Install

Add the following code on your `Gemfile` and run `bundle install`:

```ruby
gem 'rspeed'
```

## Setup

We need to extract the rake that executes the split via `rspeed:run`.

```ruby
rake rspeed:install
```

## Usage

- `RSPEED_APP`: You app name to avoid data override
- `RSPEED_PIPE`: Current pipe
- `RSPEED_PIPES`: Quantity of pipes
- `RSPEED_SPEC_PATH`: The specs folders path
- `RSPEED`: Enables RSpeed

```sh
RSPEED=true RSPEED_APP=blog RSPEED_PIPE=1 RSPEED_PIPES=3 bundle exec rake rspeed:run
```

## How it Works

### First run

1. Since we have no statistics on the first time, we run all specs and collect it;

```json
{ "file": "./spec/models/1_spec.rb", "time": 0.01 }
{ "file": "./spec/models/2_spec.rb", "time": 0.02 }
{ "file": "./spec/models/3_spec.rb", "time": 0.001 }
{ "file": "./spec/models/4_spec.rb", "time": 1 }
```

### Second and next runs

1. Previous statistics is balanced by times and distributed between pipes:

```json
{ "file": "./spec/models/4_spec.rb", "time": 1 }
```

```json
{ "file": "./spec/models/2_spec.rb", "time": 0.02 }
```

```json
{ "file": "./spec/models/3_spec.rb", "time": 0.001 }
{ "file": "./spec/models/1_spec.rb", "time": 0.01 }
```

2. Run the current pipe `1`:

```json
{ "file": "./spec/models/4_spec.rb", "time": 1 }
```

- Collects statistics and temporary save it;

4. Run the current pipe `2`:

```json
{ "file": "./spec/models/2_spec.rb", "time": 0.02 }
```

- Collects statistics and temporary save it;

5. Run the current pipe `3`:

```json
{ "file": "./spec/models/3_spec.rb", "time": 0.001 }
{ "file": "./spec/models/1_spec.rb", "time": 0.01 }
```

- Collects statistics and temporary save it;
- Sum all the last statistics and save it for the next run;