[ruby-core:112621] [Ruby master Bug#18731] Parallel test-all sometimes does not run at all some tests

Issue #18731 has been updated by luke-gru (Luke Gruber). I've been working a bit on the parallel runner and I've noticed this problem too. ``` Raise if the check Test::Unit::TestCase.test_suites-suites (which is the bug) returns an empty Array. It won't catch all issues though when e.g. 2nd test class is defined in the same file. ``` Unfortunately we can't do this because some test classes are guarded by if statements, and the array can be empty in those cases too. I'll take a look at the `method_added` solution, incrementing a number on the class and checking it matches the previous one. ---------------------------------------- Bug #18731: Parallel test-all sometimes does not run at all some tests https://bugs.ruby-lang.org/issues/18731#change-102069 * Author: Eregon (Benoit Daloze) * Status: Closed * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- In TruffleRuby I've noticed that some CRuby tests sometimes run or not, non-deterministically. The TruffleRuby CI currently runs CRuby tests with `-j4`. Today I investigated and I think I've found the reason for it. One occurrence of this bug is for: * https://github.com/ruby/ruby/blob/master/test/ruby/test_method.rb * https://github.com/ruby/ruby/blob/master/test/ruby/test_inlinecache.rb Both define a test class `TestMethod`. The parallel runner distributes files across processes. If the same worker process gets both files, then all tests in the second file are not run at all! (the file is still loaded). The reason seems this line: https://github.com/ruby/ruby/blob/8751c5c2672d1391c73d9dec590063d27bed7e4c/t... (it's also possible to reproduce with just these 2 files, `-j2` and not the full test suite, and having one worker start very slowly so the same worker gets both files) `Test::Unit::TestCase.test_suites` is an array of classes, and so here because `TestMethod` was already defined by the first file loaded, the result of `Test::Unit::TestCase.test_suites-suites` is empty, and nothing gets run. This doesn't seem an issue when not running in parallel/using `-j`. But that's rare/impractical because test-all is very slow without `-j`. For this specific case it seems we should rename the class in `test_inlinecache.rb`, but I suspect there are more name conflicts and the parallel runner should be fixed to handle this. --- <rant> FWIW, this test/unit code seems pretty messy, very long lines, [duplication](https://github.com/ruby/ruby/blob/8751c5c2672d1391c73d9dec590063d27bed7e4c/t...), hard to follow with the mix of minitest/test-unit, etc. I don't understand how this code is any better than `mspec`. It seems far more complex and hacky. And that's probably why Ruby implementations except CRuby run MRI tests only when they have no choice, it's so annoying to work with, so many unnecessary subprocesses (very slow to run, annoying to debug), many CRuby-specific tests, so many unreliable tests, many metaprogramming-defined tests which are very brittle, lots of global state and coupling, etc. </rant> -- https://bugs.ruby-lang.org/
participants (1)
-
luke-gru (Luke Gruber)