From d31fd50ea28fd6d2b6528a0a99caefdbc73aee61 Mon Sep 17 00:00:00 2001 From: shawn-shellenbarger <98493477+shawn-shellenbarger@users.noreply.github.com> Date: Mon, 1 Sep 2025 15:59:18 -0500 Subject: [PATCH 1/4] feat: improve rspec report output --- dump.rdb | Bin 0 -> 17090 bytes ruby/lib/rspec/queue.rb | 46 +++++++++++++++++++++- ruby/test/integration/rspec_redis_test.rb | 30 ++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 dump.rdb diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..c4437a641a529d63a7d848b4f9acbf788068b409 GIT binary patch literal 17090 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 Date: Sat, 6 Sep 2025 13:17:51 -0500 Subject: [PATCH 3/4] feat: add backtrace filtering --- dump.rdb | Bin 17090 -> 0 bytes ruby/lib/rspec/queue.rb | 13 ++++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) delete mode 100644 dump.rdb diff --git a/dump.rdb b/dump.rdb deleted file mode 100644 index c4437a641a529d63a7d848b4f9acbf788068b409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17090 zcmeI4dw5jkoyXsEW^x+>Br!xtgLxBjCv%@nk^%7~1SH@k5Q2c(xt>W5nVB=3GXum+ zodDJgZf&vJwSAu5U{h@sdt0T}UW`y$w-;%#YGo495_|{AO%2$+7aYD zE=zzF18UCe7x-QHb^6W@bEjF~-C?xs=7mvKuox^mgKUtc=wr;`)upwi3IG;>r!-pf zI<1@A69@{ds1-y%>$I|a?6lYKfeTblyT=*y*aN&^WfsrV2#)LZ7L!GPWA~G&s=E;X zWv-wzfM_$M=o`)7Mpb4SUp7+gQ0gs)8;z)a5*VSE{L6saCV?JlCK)gOFXm*pxgY=5 zi(z#?Fu-o|B{MKjw>Hv7ixDk1_uhxvyueWRG-ZDO;?Q04QI+j^j>-xGFQ^69&kF&u zv?J@`@Y(QLBUf)FN0v`UF8bJ-tA>71u7YqtJ{-hvI_HG`iTRiCepavtINm2h=LqW@ z6(Q$FpayVoeytCR0p2-^U$@rIdGLFwT|+L$0@*$Ij}NpIuwH*)%sO$6Lc{s2HqHDi zS~US4I#?JGf~*Rz1aLx2v93@BEDM36VLkxec8|zZT(%5qheTEowc?0){-s#Xvi;xCo!lqSxyz@Q1X`;epRE z&rvJAb(F%xS_VTasa4JJc66lxx@|&{j}LI}F{^uAj~a)^uN%KF^eWIH`c zY2D2QMwr(rV~6b~1TH}X!NL){&*fnSMg*pDd#D_3eLdv1?V&o%wm*i!??crJtJfZ= zKMn+R{RPUWlwU>Am2=T>0e%TWP7JTQ#r@22%Sz3n0@ z-J=u*r*?RmN)>cyoV-^%IKumv?Jd?iIkj|4@4vD*b`v-JWO98WxqqeGck&pp_SqaS zhrGbyT2<0wgdTPm>k(UB{qqC7AGQeW&LD?>1Y1ux^(&mbz@933iCF~yV!Ma=6m2jY zZGS4_d}6@vbF%QO6zdE(?qoKhx{=VoH|l92=tCQZsSbTuF#w01D+=ubAN0Ab4TD8i zk@F3E*g*Ygsgw5w*gXO32+xm-Xu|=@WZrir0)Iw|1BdpbwYS=S*7G8MFHRSJKfIbp zfThg_lVcUU0aymU#AQm zcU~8szvXnzg|k#WyO4PiU%KIFeOPrEX@@9dcj&Qw+s_nq!e`h|o|^Y>2=bJZ3mpa8 z#+wQ`QA_yn)ymKwg`f9$P~VBuiZ-gn@S36sU2@`F#SczZ^f&xf;pT>e2kx^^Qo8Qj z&5lng#2^x5-U^;B3>jld0{6M<*Y`Wt}ht|yh8Zx=uM$9V^*YgV@G+q?3vAz%p& zo^4w|J2)Rwt^mr%WAtAFW?_4&HZYFsx#Wcd2!JJ#IZx~ zBE#nTFHg9quDbJ!?c=BWb+lXH>VK~Aj9J;i#?dz@z5Y$Q4Hedg)#s4nSDzb4ZO^S) zJ$~z%wp&m^mvW`o&iTHf6bC5?wYP!Y>gScv9rSoiLZNdsAlRL(sl32x$2^AG^$UbC z=;3@U+-(=3oAb1M!t@CR9}H-wdJ0$;x_Bq7QSt)ZG-y0eTP&;3;ve^A2yAJ8N#XPa zMbmL$UB`%(FAF&ldO4B& z#HG+z6~}K7t_7OV+W8W6*_|x}x~(dx$JA|5ur3Q^Ds2@upupU5_!{vHdY+DG_2y6t)ZAV}wjY-Y?_R@TyK9U{OndWfPNdy+^`z5y3V7 zd`rePFol&n(RI0TZ5I=8O=Da)98hM!bx{=8jcULq@_J1P=Jkz^mrg5IB*J=aNgUP< zZvqVKwGmjqfMI>!c2@+}=i;#biUez)1Z&_p-VlfN`1cSPc6P;JJpin0%`{>4NJduo zq0$ske>VrH8{L|-=YnHL{x8FjtB3wRtUj8F)n|Z!QT<{ns$Yqr`Uh#K zR%o%<%ggFb3;v|}2`Yaw5!a3guA5`H{>-F=>(Eb9a6Le9eGAxa5-*W(jrC;&*H{cX z?OGSWxGs=!ZF&^gO;1n~t}R(`{dN+r6_nFs3TnCutUHRbz*=ulgmrx{7G0=i|J+ePp(%GF}n6jsuINk{Vr8O^5GvY~l65zVdZK!@q&^X3OApEyeyZIFm84*e`9qwOv)=Zni| zqJW_rOMcs>6b!=pB^aeyybES2(AZjvWyb=GXXXkjs-0=fUE5|Nol7L{O5!}!TpX9r z-U3YbT>6=D+e*Ol&^je1Iu_6;K8S#hJ00&8{+|%g&6x!BH2o6xJ3dSajs1>~Ktcm+ z%hE8jEn;*a=7xzQcFUn7SVd1<7GC@K#1NBJNYBOd$S$PMRD7Y~ubGAPbon`Adi=kT zWMz&$1S2NL2F*$}Tj0nj#J~R?Q`nYR+arrun(C!OxfibuW zQHy~JuA?>uVHM?NLs!Cuco0GJ`(U+FivQsL+DQB-WnnmiOUS}-UWc==N;wRZqrs@b z8i0rACxp6EC2eg(E?d7m{kN~2BYF8d9M1^{j9GNXc<;|_q0jU{Oc zoTLdel$W%jqx;#PhgDn7)a*D-jj*@L`Vy^Ah|}t;*yp7MSnsDbkH zujye})kwmzgi!4@HE8&2iDc7Craki;+K>>d$qI9rOZ5T@}{3wf5)~F+JJewn+`ck-PtDLWK4-iwJ7)QHuz~)lK1Gd|; z1#HvxTPEHM&o4_1*iiZA_PYwA>DrocTXB0w7E^%M8#+(XZ6sQou6`g~^=Fc+YQOu?7j3UL2d9(<+s z0+Qh+_W~q#VgCph0}|ntHEqfPuY`6$esKm&kJZGh0fmujKsyBl`>nVdkTGuZJj(bI z=#^Xy$bv3P>rnrQ@y5FW7+up#xkxi00?p{?Hp~TJ61vRx@YPYRw0th+VZi8 zQgbPZQe&?jpAGR+#MIC5Fwxt43=lBq{TBiwXwW_D7z}T#{8qU@G zzPR!6tXeHHk=lW8Vo5EYNPW=mbh1(#Dp7+;(oB`eLZ+X#;M`{jXb@-u)`=$AOk)ja zGlZI98GxwxYOLB&QI{m!{t5nrDprK#-L|LT6_SWMI%g60t+ct6d74PLY9irGW@#!- zlW=#IrwyWWm2gw1mT&s}ILo&=lsjVz?wVW*4!djV0&eEBr}|-B?#v+I zB%aA#AxXe(nGMdO0&YMvFEQuPeoqlE3&}XUG7)EksW{WVpRV5&Nuww54LmdOMdt1d z<<6wh6Gt6JI6m;uw>G?`VJY4K%UcZXP;HErgmgIZFyMAjqtp)4k#)X$yBa|WT zNb3ki;*R8!&`YGh87T?nFa!0eH6b&u3DpE~_BGPF!A+}cl5ymkL_^27CK0er#Cokfj-{WR4A`Xsh}EchbGVm2bsQ*9##TqyN-6T zE@lhR!LkoJIj35J-=VZl1b&4DrL?qW>6Y}Qwi&s6Jy%dJ7Fk7L44o=VQ<(5C3sX%( zq&g^hgyY*|9^s+uQawV9J1OcoB=p$H;*i}L&pJMn<`E|7%=*t4MZ=C|b@>M9M5UR_ zADm6pfwzbDAHbc*Gc|~~gy*xv%-xf+J(L`GWZEB+qK?8y)X~zMViiV`j#oc4t57aJ zp4F`;3q*IX$d++L7l={=js%Zz$J^Ngju~$dwLg|W=f>TjhAF{3gPE#(o)?- zqYyq@AaClzN9C2z$@r$@#9?9+O8G~ZDf950Isb^nxPchkCU&N>Ep$gD|A;O{CgdMv zDKa_#h_S7AwH$x^Nt&RmA{&ue;*YFkqs)fAKa6F#_zvoy#SHB*$ZL@VY>~CdSp1PB z&~nBf)2dq#w7RQ84u-_PIip;>HJTjdBK>r1F)}5=opS`TuQvN~0SDv)$pw&y8jvd& Date: Sat, 6 Sep 2025 15:30:09 -0500 Subject: [PATCH 4/4] feat: add test summary to minitest --- .../minitest/queue/build_status_reporter.rb | 36 ++++++++++++++++++- ruby/test/integration/minitest_redis_test.rb | 25 +++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/ruby/lib/minitest/queue/build_status_reporter.rb b/ruby/lib/minitest/queue/build_status_reporter.rb index 4d663648..43b5c3f7 100644 --- a/ruby/lib/minitest/queue/build_status_reporter.rb +++ b/ruby/lib/minitest/queue/build_status_reporter.rb @@ -153,7 +153,10 @@ def report puts errors = error_reports - puts errors + if errors.any? + pretty_print_summary(errors) + pretty_print_failures(errors) + end build.worker_errors.to_a.sort.each do |worker_id, error| puts red("Worker #{worker_id } crashed") @@ -224,6 +227,37 @@ def write_flaky_tests_file(file) attr_reader :build, :supervisor + def pretty_print_summary(errors) + test_paths = errors.map(&:test_file).compact + return unless test_paths.any? + + file_counts = test_paths.each_with_object(Hash.new(0)) { |path, counts| counts[path] += 1 } + + puts "\n" + "=" * 80 + puts "FAILED TESTS SUMMARY:" + puts "=" * 80 + file_counts.sort_by { |path, _| path }.each do |path, count| + relative_path = Minitest::Queue.relative_path(path) + if count == 1 + puts " #{relative_path}" + else + puts " #{relative_path} (#{count} failures)" + end + end + puts "=" * 80 + end + + def pretty_print_failures(errors) + errors.each_with_index do |error, index| + puts "\n" + "-" * 80 + puts "Error #{index + 1} of #{errors.size}" + puts "-" * 80 + puts error + end + + puts "=" * 80 + end + def timed_out? supervisor.time_left.to_i <= 0 end diff --git a/ruby/test/integration/minitest_redis_test.rb b/ruby/test/integration/minitest_redis_test.rb index 59840870..43f7b8cd 100644 --- a/ruby/test/integration/minitest_redis_test.rb +++ b/ruby/test/integration/minitest_redis_test.rb @@ -954,15 +954,40 @@ def test_redis_reporter Ran 7 tests, 8 assertions, 2 failures, 1 errors, 1 skips, 4 requeues in X.XXs (aggregated) + + ================================================================================ + FAILED TESTS SUMMARY: + ================================================================================ + test/dummy_test.rb (3 failures) + ================================================================================ + + -------------------------------------------------------------------------------- + Error 1 of 3 + -------------------------------------------------------------------------------- FAIL ATest#test_bar Expected false to be truthy. test/dummy_test.rb:10:in `test_bar' + + -------------------------------------------------------------------------------- + Error 2 of 3 + -------------------------------------------------------------------------------- FAIL ATest#test_flaky_fails_retry Expected false to be truthy. test/dummy_test.rb:23:in `test_flaky_fails_retry' + + -------------------------------------------------------------------------------- + Error 3 of 3 + -------------------------------------------------------------------------------- ERROR BTest#test_bar + Minitest::UnexpectedError: TypeError: String can't be coerced into Integer + test/dummy_test.rb:37:in `+' + test/dummy_test.rb:37:in `test_bar' + test/dummy_test.rb:37:in `+' + test/dummy_test.rb:37:in `test_bar' + + ================================================================================ END assert_includes output, expected_output end