เป็นไปได้ไหมที่จะทำการทดสอบเดี่ยวใน MiniTest?


168

ฉันสามารถรันการทดสอบทั้งหมดในไฟล์เดียวด้วย:

rake test TEST=path/to/test_file.rb

อย่างไรก็ตามหากฉันต้องการทดสอบเพียงหนึ่งไฟล์ในไฟล์นั้นฉันจะทำอย่างไร

ฉันกำลังมองหาฟังก์ชั่นที่คล้ายกับ:

rspec path/to/test_file.rb -l 25

3
8 ปีต่อมาและสำหรับผู้ใช้งานรถไฟ 5+ คนrails test path/to/test_file.rb:25ดู @Derek_Hill ans - นำมาจากguide.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

คำตอบ:


44

ฉันกำลังมองหาฟังก์ชั่นที่คล้ายกับเส้นทาง rspec / to / file.rb -l 25

ได้! ใช้นิค Quaranto ของ "M" อัญมณี ด้วยคุณสามารถพูดได้:

m spec/my_spec.rb:25

4
ในขณะที่คำตอบใช้ได้ผลและเป็นสิ่งที่ถูกถาม :-) วิธีทดสอบแบบย่อส่วนของการทดสอบเดี่ยวคือการจับคู่ชื่อ (ดูคำตอบของนายกริมม์) หากคุณลองและปฏิเสธมันถึงเวลาแล้วที่จะลองใช้ตัวเลือกที่ไม่มีมาตรฐานเช่น Nick's Gem
notapatch

3
จริงฉันเห็นด้วย ฉันต้องการให้คุณผ่าน -n เป็นตัวเลือก ... หรือ MiniTest นั้นสนับสนุนโดยใช้หมายเลขบรรทัดและชื่อเมธอด
Elliot Winkler


ในขณะที่อัญมณีนี้ทำให้สิ่งที่คล้ายกับวิธีการ rspec ของการทดสอบเดียว Minitest มีวิธีในตัวเพื่อเรียกใช้การทดสอบเดียวที่เป็นคำถาม ไม่จำเป็นต้องพึ่งพา มันเป็นสิ่งที่ดีที่จะรู้ว่าอาจจะง่ายขึ้นด้วยอัญมณีเสริม (เช่นอาจจะมีรอบอีกหลายคน) แต่ผมคิดว่าสำหรับคำถามนี้คำตอบที่ minitest บริสุทธิ์เช่นจาก jduan หรือ randomor จะพอดีกับที่ดีกว่า
cefigueiredo

209

คำสั่งควรเป็น:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"

6
+1 - นี่คือสิ่งที่คุณต้องการทำ หากคุณต้องการทดสอบการทดสอบทั้งหมดในไฟล์เฉพาะให้ออกTESTOPTS=...ไป
awenkhh

คำตอบที่มีประโยชน์มาก ฉันทำให้ MinitestReporter แสดงคำสั่งการรันซ้ำของการทดสอบที่ล้มเหลวในตอนท้ายของรายงานการทดสอบ ดู: gist.github.com/foton/141b9f73caccf13ccfcc
Foton

1
อะไร-vทำอย่างไร
Jon Schneider

149

คุณเคยลองไหม:

ruby path/to/test_file.rb --name test_method_name

10
แล้วการทดสอบโดยใช้ Minispec หมายถึงspecify {}อะไร สิ่งเหล่านั้นแสดงเป็นtest_0001_anonymous... และอาจมีหลายtest_0001_anonymouss หากใช้ไวยากรณ์เดียวกันในหลายคำอธิบายบล็อก ... คำแนะนำใด ๆ สำหรับการใช้การทดสอบเดี่ยวในสภาพแวดล้อมแบบนี้?
neezer

1
"tc" หมายถึง "กรณีทดสอบ"
Andrew Grimm

4
cannot load such file -- test_helperมันบอกว่า
x-yuri

11
ใช้งาน ruby -Itest path/to/tc_file.rb --name test_method_nameเหมือนstackoverflow.com/a/15714985/327786
TlmaK0

bundle exec ruby -I lib path/to --name test_fit
puchu


49

นี่คือหนึ่งในสิ่งที่รบกวนฉันเกี่ยวกับการstring name definitionทดสอบ

เมื่อคุณมี:

def test_my_test
end

คุณมักจะรู้ว่าชื่อการทดสอบของคุณเป็นอย่างไรเพื่อให้คุณสามารถดำเนินการได้ดังนี้:

ruby my_test -n test_my_test

แต่เมื่อคุณมีสิ่งที่ชอบ:

it "my test" do
end

คุณไม่แน่ใจว่าวิธีการทดสอบนี้มีชื่อจริง ๆ ภายในหรือไม่ดังนั้นคุณจึงไม่สามารถใช้-nตัวเลือกได้โดยตรง

หากต้องการทราบว่าการทดสอบนี้มีชื่อภายในคุณมีเพียงตัวเลือก: เรียกใช้ไฟล์ทั้งหมดเพื่อลองค้นหาในบันทึก

วิธีแก้ปัญหาของฉันคือ (ชั่วคราว) เพิ่มบางสิ่งบางอย่างในชื่อการทดสอบที่ไม่ซ้ำกันมากเช่น:

it "my test xxx" do
end

จากนั้นใช้พารามิเตอร์ '-n' รุ่นRegExเช่น:

ruby my_test.rb -n /xxx/

6
รุ่น regex ของพารามิเตอร์ -n คือส่วนที่คลัตช์ของข้อมูลขอบคุณ!
Woahdae

โปรดทราบว่าคุณสามารถตรวจสอบสิ่งนี้ได้โดยการโทร__method__ภายในบริบทของวิธีการดำเนินการปัจจุบัน (การทดสอบของคุณในตัวอย่างนี้) "does not break my stuff".gsub(" ", "_").prepend("test_")ผลการดำเนินงานอยู่ในสิ่งที่ต้องการ ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuffจากนั้นเรียกยกตัวอย่างเช่น
TK-421

33

หากคุณใช้ MiniTest กับ Rails 5+ วิธีที่ดีที่สุดในการรันการทดสอบทั้งหมดในไฟล์เดียวคือ:

bin/rails test path/to/test_file.rb

และสำหรับการทดสอบเดี่ยว (เช่นในบรรทัดที่ 25):

bin/rails test path/to/test_file.rb:25

ดูhttp://guides.rubyonrails.org/testing.html#the-rails-test-runner


23

คุณสามารถใช้สิ่งนี้เพื่อเรียกใช้ไฟล์เดียว:

rake test TEST=test/path/to/file.rb

ฉันยังใช้

ruby -I"lib:test" test/path/to/file.rb

เพื่อการแสดงผลที่ดีขึ้น


12

มี 2 ​​วิธีในการทำ:

  1. เรียกใช้การทดสอบ 'ด้วยตนเอง' (ดูคำตอบของ Andrew Grimm)
  2. แฮ็คRake::TestTaskเป้าหมายเพื่อใช้โหลดเดอร์ทดสอบอื่น

Rake::TestTask(จาก rake 0.8.7) ในทางทฤษฎีสามารถส่งตัวเลือกเพิ่มเติมไปยังMiniTest::Unitด้วย"TESTOPTS=blah-blah"ตัวเลือกบรรทัดคำสั่งตัวอย่างเช่น:

% rake test TEST = test / test_foobar.rb TESTOPTS = "- ชื่อ test_foobar1 -v"

ในทางปฏิบัติตัวเลือก--name(ตัวกรองสำหรับชื่อการทดสอบ) จะไม่ทำงานเนื่องจากการคราดภายใน ในการแก้ไขปัญหานั้นคุณจะต้องเขียนโปรแกรมแก้ไขลิงตัวเล็ก ๆ ใน Rakefile ของคุณ:

# overriding the default rake tests loader
class Rake::TestTask
  def rake_loader
    'test/my-minitest-loader.rb'
  end
end

# our usual test terget 
Rake::TestTask.new {|i|
  i.test_files = FileList['test/test_*.rb']
  i.verbose = true 
}

แพตช์นี้ต้องการให้คุณสร้างไฟล์test/my-minitest-loader.rb:

ARGV.each { |f|
  break if f =~ /^-/
  load f
}

หากต้องการพิมพ์ตัวเลือกที่เป็นไปได้ทั้งหมดสำหรับ Minitest ให้พิมพ์

% ruby ​​-r minitest / autorun -e '' - - ช่วย

3
โปรดทราบว่าตัวอย่างเริ่มต้นทำงานได้อย่างถูกต้องเมื่อเร็ว ๆ นี้rake(0.9.2) และไม่จำเป็นต้องใช้ตัวปะแก้ลิง
ความสับสน

1
เมื่อฉันพยายามกับรุ่นคราด 10.5.0 TESTOPTS="--name test_foobar"ไม่ทำงาน แต่ใช้TESTOPTS="--name=test_foobar"งานได้
kangkyu

11

คุณสามารถผ่าน --nameเพื่อรันการทดสอบตามชื่อหรือหมายเลขภายในชื่อ:

-n, --name PATTERN               Filter run on /regexp/ or string.

เช่น:

$ ruby spec/stories/foo_spec.rb --name 3

FAIL (0:00:00.022) test_0003_has foo
Expected: "foo"
Actual: nil

ธงนี้เป็นเอกสารใน README


1

หากคุณใช้เทิร์นเจมด้วย minitest เพียงให้ใช้Turn.config.patternตัวเลือกเนื่องจาก Turn Minitest runner ไม่เคารพตัวเลือก --name ใน ARG


นี่คือคำใบ้ที่ฉันต้องรู้ว่า Turn คือสิ่งที่กลืนnameตัวเลือก ขอบคุณ! เมื่อถึงคราวนั้นไม่ได้รับการดูแลรักษาอีกต่อไปฉันวางแผนที่จะย้ายไปยังผู้สื่อข่าวรายย่อย
pdobb

1

ฉันกำลังมองหาฟังก์ชั่นที่คล้ายกับ:

rspec path / to / test_file.rb -l 25

มีอัญมณีที่ทำสิ่งนั้นอย่างแน่นอน: minitest-line.

gem install minitest-line
ruby test/my_file -l 5

จากhttps://github.com/judofyr/minitest-line#minitest-line


สวัสดี @ChrisHough คุณช่วยอธิบายสิ่งที่ใช้ไม่ได้จริง ๆ (เช่นข้อความแสดงข้อผิดพลาด) หรือไม่? วัตถุประสงค์ของ minitest-line นั้นมีวัตถุประสงค์เพื่อทำการทดสอบเดี่ยวใน MiniTest ถ้ามันไม่ทำงานคุณอาจพบข้อบกพร่องใน minitest-line
knugie

1

ฉันใช้ ruby /path/to/test -n /distinguishable word/

แก้ไข: จดชวเลขเป็น-n อาจเป็นสตริงที่คุณใส่ในคำอธิบายการทดสอบฉันมักจะใช้คำสุ่มที่ฉันรู้ว่าจะไม่ปรากฏในคำอธิบายการทดสอบอื่น ๆ--namedistinguishable word


คุณช่วยอธิบายเพิ่มเติมได้ไหม -nพารามิเตอร์นั้นหมายความว่าอย่างไร
Nico Haase

--nameมันเป็นชวเลขเป็น เป็นเพียงสิ่งอำนวยความสะดวก มีประโยชน์อย่างยิ่งกับ / regex / ฉันมักจะใส่คำแบบสุ่มบางคำในชื่อการทดสอบ (ที่ฉันรู้ว่าจะไม่ปรากฏในคำอธิบายการทดสอบอื่น ๆ )
sloneorzeszki

1
โปรดเพิ่มคำอธิบายบางอย่างเกี่ยวกับการตอบคำถามด้วยตัวเองไม่ใช่ในส่วนความคิดเห็น
Nico Haase

0

ต่อไปนี้จะทำงาน

def test_abc
end

test "hello world"
end

สิ่งนี้สามารถดำเนินการได้

bundle exec ruby -I test path/to/test -n test_abc

bundle exec ruby -I test path/to/test -n test_hello_word

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.