1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
Minitest + all the features you always wanted.
[](https://github.com/grosser/maxitest/actions/workflows/actions.yml?query=branch%3Amaster)
[](https://badge.fury.io/rb/maxitest)

Features
========
- **Ctrl+c** stops tests and prints failures
- **pastable rerun snippet** for failures (disabled/integrated on rails 5)
- multiple before & after blocks
- `before :all` blocks
- **around** blocks `around { |t| Dir.chdir(...) { t.call } }`
- **red-green** output (disabled/integrated on rails 5)
- `mtest` executable to **run by line number** and by folder (disabled/integrated on rails 5)
- full backtrace for errors and assertions with verbose (`-v`)
- `let!`
- `let_all` execute once for all tests in a class and it's subclasses
- `order_dependent!` to make your tests run in given order
- `Maxitest.static_class_order = true` no longer sort tests class/sub-classes in random order
- `context` for more expression
- `pending { assert false }` is skip when it fails, but fails when it passes
- implicit subject via `require 'maxitest/implicit_subject'`
- `xit` to skip test (also does not call setup or teardown)
- `with_env` to change environment variables during test run
- `capture_stdout` and `capture_stderr` to capture stdout or stderr but not both (like `capture_io` does)
- `require 'maxitest/timeout'` to make hanging tests fail after `Maxitest.timeout` seconds
- `require 'maxitest/threads'` fail tests that leave extra threads running
- `require 'maxitest/global_must'` (before autorun) disable deprecation on global `must_*` or [global_expectations](https://github.com/jeremyevans/minitest-global_expectations) gem
Install
=======
```Bash
gem install maxitest
```
Usage
=====
```Ruby
require "maxitest/autorun"
# ... normal minitest tests ...
describe MyClass do
describe "#my_method" do
it "passes" do
_(MyClass.new.my_method).must_equal 1
end
end
end
```
### pending
- `pending "need to fix" do` to show why something is pending
- `pending "need to fix", if: ENV["CI"] do` to only skip on CI (if something is supposed to work locally)
### with_env
Use during test: `with_env FOO: "bar do ...`
Use as `around` block: `with_env FOO: "bar"`
### context
Use as alias for `describe`
```ruby
describe "#my_method" do
context "with bad state" do
before { errors += 1 }
it "fails" # ...
end
end
```
### capture_stdout / capture_stderr
```ruby
output = capture_stdout { puts 1 }
_(output).must_equal "1\n"
```
### minitest-reporters
If [PR](https://github.com/minitest-reporters/minitest-reporters/pull/357) is not resolved,
disable Interrupt handling with `ENV["MAXITEST_NO_INTERRUPT"] = "true"` to avoid "stack level too deep" errors.
Development
===========
- everything vendored into 1 gem to avoid dependency madness
- tested via rspec to avoid messing up our own tests by accident
- fixes should go back to the original libraries
- restrictive minitest dependency so nothing breaks by accident
- ruby >=3.0
- `rake bundle` to update all vendored gems
Author
======
- running by line number from [minitest-line](https://github.com/judofyr/minitest-line)
- around from [minitest-around](https://github.com/splattael/minitest-around)
- mtest from [testrbl](https://github.com/grosser/testrbl)
- red-green from [minitest-rg](https://github.com/blowmage/minitest-rg)
[Michael Grosser](http://grosser.it)<br>
michael@grosser.it<br>
License: MIT
|