https://github.com/floraison/probatio
testing tools for floraison and flor
https://github.com/floraison/probatio
Last synced: about 1 year ago
JSON representation
testing tools for floraison and flor
- Host: GitHub
- URL: https://github.com/floraison/probatio
- Owner: floraison
- License: mit
- Created: 2024-12-18T08:10:22.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-05-07T05:56:52.000Z (about 1 year ago)
- Last Synced: 2025-05-07T06:04:27.330Z (about 1 year ago)
- Language: Ruby
- Size: 149 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# probatio
[](https://badge.fury.io/rb/probatio)
Test tools for floraison and flor. Somewhere between Minitest and Rspec, but not as excellent.
## Goals
* versatile `bundle exec proba`, run this or these tests, at the line
* `bundle exec proba first` for first failing tests
* `bundle exec proba last` for last failing tests
* `bundle exec proba .` for the test currently edited `.test-point`
* `bundle exec proba f` for the test file currently edited `.test-point`
* `bundle exec proba list.txt` to run a list of tests
* `bundle exec proba list.rb` to run a list of tests (Ruby array)
## Usage
```
Usage: bundle exec proba [OPTIONS] [DIRS] [FILES] [OTHERS] [ENVS]
A test runner for Ruby.
Options:
-h, --help Show this help message and quit
--version Show proba's version and exit
-c, --color Enable colour output anyway
-C, --no-color Disable colour output
-y, --dry Don't run the tests, just flag them as successes
-n, --name PATTERN include tests matching /regexp/ or string in run
-e, --exclude PATTERN Exclude /regexp/ or string from run
-p, --print Dumps the test tree
-m, --map Dumps the test file map
-s, --seed Sets random seed
-d, --debug smr 's' for start opts, 'm' for messages, 'r' for $DEBUG
-x, --example Outputs an example test file
-X, --plugin-example Outputs an example plugin file
--mangle Turns the given _spec.rb files into proba _test.rb
Dirs:
Defaults to test/ if no files nor dir are given.
Probatio will look at all the *_helper[s].rb, *_test[s].rb files
under the given dirs and also at the setup.rb, *_setup.rb files
Files:
List of test files to scan for tests.
A file may end with `:123` to indicate that the test at line 123 should
be run. Multiple "colon-lnumber" suffixes may be specified, as in
`test/fun/that_test.rb:123:456`
Others:
Short codes like
* `bundle exec proba -1`
* `bundle exec proba last` run the last failing test of the last run
* `bundle exec proba first`
* `bundle exec proba 1st`
* `bundle exec proba 0` run the first failing test of the last run
Lists:
* `bundle exec proba list.txt` will run all the tests in list.txt
* `bundle exec proba a_list.rb` will eval and lists the arrayed tests
Envs:
Short FULLCAPS environment variable setters driven by a
`.probatio-environments.rb` file in the current work directory.
```
# .probatio-environments.rb
{
D: { 'FLOR_DEBUG' => 'dbg,stdout' },
DD: { 'FLOR_DEBUG' => 'dbg,sto,stdout' },
}
```
Examples:
# Run all tests in a dir
bundle exec proba test/
# Run all the tests in a file
bundle exec proba test/this_test.rb
```
## Test files
By default probatio looks into `test/` for test files ending in `_test.rb` or `_tests.rb` but first look at helpers ending in `_helper.rb` or `_helpers.rb`.
A typical test hierarchy:
```
test/
|-- helpers/
| |-- some_helpers.rb
| `-- some_other_helpers.rb
|-- this_test.rb
|-- that_test.rb
`-- more_tests.rb
```
```ruby
group 'core' do
setup do
# occurs once before tests and sub-groups in group 'core'
end
teadowm do
# occurs once after tests and sub-groups in group 'core'
end
group 'alpha' do
before do
# is run in the separate test context before _each_ test
end
after do
# is run in the separate test context after _each_ test
end
test 'one' do
MyLib.do_this_or_that()
assert_nil nil
assert_not_nil [], 1
assert_true true
assert_false 1 > 2
assert_truthy "yes", "no"
assert_trueish "yes", "no"
assert_falsy nil, false
assert_falsey nil, false
assert_falseish nil, false
assert_any %w[ an array ], 'a string'
assert_empty [], ''
assert_size [], 0
assert_size 'foo', 3
assert_size { a: 1 }, 1
assert_count %w[ a b c ], 3
assert_equal 'one', 'o' + 'ne'
# checks that all its arguments are equal
assert_match 'one', /^one$/
# checks that it receives a regex and one or more strings
# and that all those strings match the regex
assert_start_with 'one', 'one two or three'
# checks that the shortest string is the start of the remaining string
# arguments
assert_end_with 'three', 'one two or three'
# checks that the shortest string is the end of the remaining string
# arguments
assert_include 1, [ 1, 'two' ]
# checks that the first array argument includes all other arguments
assert_error(ArgumentError) { do_this_or_that() }
# checks that the given block raises an ArgumentError
assert_error(ArgumentError, /bad/) { do_this_or_that() }
# checks that the given block raises an ArgumentError and
# the error message matches the /bad/ regexp
assert_error lambda { do_this_or_that() }, ArgumentError
# checks that the given Proc raises an ArgumentError
assert_error lambda { do_this_or_that() }, ArgumentError, 'bad'
# checks that the given Proc raises an ArgumentError and
# the error message == "bad"
assert_no_error { do_this_or_that() }
assert_no_error lambda { do_this_or_that() }
assert_not_error { do_this_or_that() }
assert_not_error lambda { do_this_or_that() }
# checks that the block or Proc does not raise an error
assert_hashy(
this_thing => 1,
that_thing => 'two')
# combines two assert_equals in one
assert_instance_of 1, Integer
assert_is_a Integer, 123
# checks that value or set of values are of a given of class
assert 1, 1
# behaves like assert_equal
assert 'one', /one/i
# behaves like assert_match
assert 11 => '10'.to_i + 1
# assert equality between key and value
assert 'one' => 'on' + 'e', 'two' => :two.to_s
# assert equality between keys and values
end
end
group 'bravo' do
end
end
group 'core' do
#
# it's OK to re-open a group to add sub-groups, tests,
# and setups, teardowns, befores, or afters
#
# it's OK to re-open a group in another file, as long
# as it's the same name at the same point in the name hierarchy
_test 'not yet' do
#
# prefix a test, a group, or other element with _
# marks it as _pending
end
end
group 'core', 'sub-core', 'sub-sub-core' do
#
# it's OK to specifiy a path of group names
test 'this' do
end
end
group 'core < sub-core < sub-sub-core' do
#
# this is also ok...
test 'that' do
end
end
```
## .test-point
By running `bx proba .`, one tells probatio to run the test pointed at in the file `.test-point`.
Here is an example of `.test-point` content:
```
test/wma/dwm/onboarding_benchmark_non_star_test.rb:189
```
For Vim users, here is a snippet that saves the current path and line number to `.test-point` every 700ms:
```vim
au BufEnter test/*_test.rb,test/**/*_test.rb :set updatetime=700
au BufEnter,CursorHold,BufWrite test/*_test.rb,test/**/*_test.rb :call writefile([ expand('%') . ':' . line('.') ], '.test-point', 'b')
```
## .probatio-output.rb
By default, probatio summarizes a run in a `.probatio-output.rb` file.
Here is an example of such a file:
```ruby
# .probatio-output.rb
{
argv: [ "test/alpha_test.rb:23" ],
failures:
[
{ n: "test_fail", p: "test/alpha_test.rb", l: 24, t: "0s000_077" },
{ n: "test_fail", p: "test/alpha_test.rb", l: 29, t: "0s000_033" },
],
duration: "0s001_297",
probatio: { v: "1.0.0" },
ruby:
{
p: "/usr/local/bin/ruby33",
d: "ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-openbsd]",
l: 100,
},
some_env:
{
USER: "jmettraux",
HOME: "/home/jmettraux",
PATH: "/home/jmettraux/.gem/ruby/3.3/bin:/home/jmettraux/.pkg_rubies/ruby33:/usr/local/jdk-21/bin:/home/jmettraux/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin",
SHELL: "/usr/local/bin/fish",
GEM_HOME: "/home/jmettraux/.gem/ruby/3.3",
PWD: "/home/jmettraux/w/probatio/test",
},
}
```
Probatio uses it when servicing `bundle exec proba 0` or `bundle exe proba -1`.
It can also be useful to other tools around probatio.
## Warnings
```
$ RUBYOPT="-w $RUBYOPT" bundle exec proba
```
## Plugins
```ruby
#
# examples of probatio plugins
class MyProbatioPlugin
def on_test_succeed(ev)
puts "GREAT SUCCESS! " + ev.to_s
end
end
Probatio.plug(MyProbatioPlugin.new)
```
## LICENSE
MIT, see [LICENSE.txt](LICENSE.txt)