Testing Ruby

All the commands below assume that you’re running them from the build/ directory made during Building Ruby.

Most commands below should work with GNU make (the default on Linux and macOS), BSD make and NMAKE, except where indicated otherwise.

Test suites

There are several test suites in the Ruby codebase:

We can run any of the make scripts in parallel to speed them up.

  1. bootstraptest/

    This is a small test suite that runs on Miniruby. We can run it with:

    make btest
    

    To run individual bootstrap tests, we can either specify a list of filenames or use the --sets flag in the variable BTESTS:

    make btest BTESTS="../bootstraptest/test_string.rb ../bootstraptest/test_class.rb"
    make btest BTESTS="--sets=string,class"
    

    To run these tests with verbose logging, we can add -v to the OPTS:

    make btest OPTS="--sets=string,class -v"
    

    If we want to run the bootstrap test suite on Ruby (not Miniruby), we can use:

    make test
    

    To run these tests with verbose logging, we can add -v to the OPTS:

    make test OPTS=-v
    

    (GNU make only) To run a specific file, we can use:

    make ../test/ruby/test_string.rb

    You can use the -n test option to run a specific test with a regex:

    make ../test/ruby/test_string.rb TESTOPTS="-n /test_.*_to_s/"
  2. test/

    This is a more comprehensive test suite that runs on Ruby. We can run it with:

    make test-all
    

    We can run a specific test file or directory in this suite using the TESTS option, for example:

    make test-all TESTS="../test/ruby/"
    make test-all TESTS="../test/ruby/test_string.rb"

    We can run a specific test in this suite using the TESTS option, specifying first the file name, and then the test name, prefixed with --name. For example:

    make test-all TESTS="../test/ruby/test_string.rb --name=TestString#test_to_s"

    To run these tests with verbose logging, we can add -v to TESTS:

    make test-all TESTS=-v

    We can display the help of the TESTS option:

    make test-all TESTS=--help

    We can run all the tests in test/, bootstraptest/ and spec/ (the spec/ is explained in a later section) all together with:

    make check
    
  3. spec/ruby

    This is a test suite defined in the Ruby spec repository, and is periodically mirrored into the spec/ruby directory of this repository. It tests the behavior of the Ruby programming language. We can run this using:

    make test-spec
    

    We can run a specific test file or directory in this suite using the SPECOPTS option, for example:

    make test-spec SPECOPTS="../spec/ruby/core/string/"
    make test-spec SPECOPTS="../spec/ruby/core/string/to_s_spec.rb"

    To run a specific test, we can use the --example flag to match against the test name:

    make test-spec SPECOPTS="../spec/ruby/core/string/to_s_spec.rb --example='returns self when self.class == String'"

    To run these specs with verbose logging, we can add -v to the SPECOPTS:

    make test-spec SPECOPTS="../spec/ruby/core/string/to_s_spec.rb -Vfs"

    (GNU make only) To run a ruby-spec file or directory, we can use

    make ../spec/ruby/core/string/to_s_spec.rb
  4. spec/bundler

    The bundler test suite is defined in the RubyGems repository, and is periodically mirrored into the spec/ruby directory of this repository. We can run this using:

    make test-bundler
    

    To run a specific bundler spec file, we can use BUNDLER_SPECS as follows:

    make test-bundler BUNDLER_SPECS=commands/exec_spec.rb

Troubleshooting

Running test suites on s390x CPU Architecture

If we see failing tests related to the zlib library on s390x CPU architecture, we can run the test suites with DFLTCC=0 to pass:

DFLTCC=0 make check

The failures can happen with the zlib library applying the patch madler/zlib#410 to enable the deflate algorithm producing a different compressed byte stream. We manage this issue at [ruby-core:114942][Bug #19909].