Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ดู Minitest Failures แบบ Real-Time ทันที

กำลัง check in feature ถัดไป รัน full integration test suite รอ... รอ... dots เติมจอ จน...

......FF....
:-(

ยังเหลือ 몇 นาทีก่อน tests จบ แตถ้าหยุด test run ก่อน จะ ไม่มีทางรู้ ว่า tests ไหน fail

ต้องรอจนจบจริงๆ ก่อนถึงจะเห็น failures?

Ctrl-T ช่วยชีวิต!

บน Mac มีวิธีเห็น test failures เร็ว:

กด Ctrl-T ขณะ tests รันอยู่

จะเห็น test case ไหนกำลังรัน และรันนานแค่ไหน ถ้ามี tests fail แล้ว จะ เห็น failures ด้วย ทำให้เริ่ม fix ก่อน run ถัดไป!

ช่วย debug tests ที่ hang ด้วย Ctrl-T บอกว่า test ไหน พยายาม รัน isolate แค่ตัวนั้นแก้

สุดท้าย ผมนิสัยกด Ctrl-T เวลา test ใช้เวลานานผิดปกติ (วินาทีขึ้นไป) ชี้ slow tests ที่ต้องเร่งหลายครั้ง

Ctrl-T ทำงานยังไง?

บน Mac Ctrl-T ส่ง signal เรียก INFO ให้โปรแกรมที่รัน:

signal_test.rb
puts "Starting..." trap("INFO") { puts "INFO triggered!" } loop { print "."; sleep 0.1}
~/Source jweiss$ ruby signal_test.rb Starting... ........^Tload: 7.14 cmd: ruby 6121 running 0.10u 0.08s INFO triggered! .......^Tload: 7.14 cmd: ruby 6121 running 0.10u 0.08s INFO triggered! ................^Tload: 11.77 cmd: ruby 6121 running 0.10u 0.08s .INFO triggered! ......^Csignal_test.rb:5:in `sleep': Interrupt from signal_test.rb:5:in `block in <main>' from signal_test.rb:5:in `loop' from signal_test.rb:5:in `<main>'

Minitest รู้จัก INFO ตอบโดยพิมพ์ info เกี่ยวกับ test run:

~/Source/rails/activesupport[master] jweiss$ be rake /usr/local/Cellar/ruby/2.2.0/bin/ruby -w -I"lib:test" "/usr/local/Cellar/ruby/2.2.0/lib/ruby/2.2.0/rake/rake_test_loader.rb" "test/**/*_test.rb" Run options: --seed 33445 # Running: .................F........^Tload: 1.62 cmd: ruby 29646 running 4.37u 1.40s Current results: 1) Failure: CleanLoggerTest#test_format_message [/Users/jweiss/Source/rails/activesupport/test/clean_logger_test.rb:13]: Expected "error\n" to not be equal to "error\n". Current: DigestUUIDExt#test_invalid_hash_class 0.02s ............................

ดีมาก!

รู้ว่าทำได้ อาจคิดวิธี apps อื่น handle INFO:

  • Rails แสดง current controller action หรือ performance stats
  • Sidekiq บอกแต่ละ worker ทำอะไร เห็นว่าติดที่ไหน

Sidekiq เคย用 INFO พิมพ์ backtrace ของ threads แต่ INFO ไม่ supported on Linux Sidekiq เปลี่ยน signal แต่ signal นั้น trigger ด้วย keyboard shortcut ไม่ได้เหมือน INFO

เพราะ INFO ไม่มีบน Linux (และบางคนบอกว่า用 INFO แบบนี้ไม่ถูกต้อง) behavior นี้ไม่แพร่หลาย

แตยังเป็นความช่วยเหลือเล็กน้อยที่มีประโยชน์ในหลายสถานการณ์ ถ้าสร้างแอป คุ้มค่าคิดว่าจะแสดง status messages อะไร on-demand ให้คนสนใจ