테스트 방법 하나만 실행하는 게 귀찮아서 미니 테스트runner.rb라는 대본을 써봤어요.

10173 단어 Rubyminitesttech
minitest에서 아래 옵션-n을 사용하면 테스트 방법(테스트 용례) 하나만 실행할 수 있습니다.
ruby test/test_foo.rb -n {メソッド名}
이때 파일 이름은 조개껍질에 대한 보완이 유효하기 때문에 빠르게 입력할 수 있지만 방법명은 조개껍질에 대한 보완이 무효입니다.
그리고 수동 입력, 편집에서 열린 테스트 코드와 파일의grep 결과를 복사하면 어쨌든 번거롭다.
그래서 대본을 하나 썼어요.

사용법

  • (1) 프로젝트의 루트 디렉터리에서 실행ruby minitest_runner.rb
  • (2) 테스트 파일은 번호가 열거되어 있기 때문에 번호를 입력하여 선택
  • (3) 선택한 파일 내의 테스트 방법은 번호가 있는 형식으로 열거되어 입력 번호 선택
  • (4) 선택한 테스트 방법 실행
  • 기본입니다.
    ruby minitest_runner.rb {ファイルの番号} {メソッドの番号}
    
    처럼 매개 변수로 파일과 방법의 번호를 지정할 때 상호작용이 되지 않습니다.번호를 알았으니 몇 번을 반복하고 싶으면 이렇게.

    실행 예


    예로Rake 만들어 본 것.
    $ ruby minitest_runner.rb
    ----
    files:
      (0) . / test / test_private_reader.rb (0)
      (1) . / test / test_rake.rb (1)
      (2) . / test / test_rake_application.rb (2)
      ... 長いので途中省略 ...
      (43) . / test / test_rake_win32.rb (43)
      (44) . / test / test_thread_history_display.rb (44)
      (45) . / test / test_trace_output.rb (45)
    
    Select item: 44 ... 番号を入力する
    ----
    methods:
      (0) test_banner (0)
      (1) test_item_queued (1)
      (2) test_item_dequeued (2)
      (3) test_multiple_items (3)
      (4) test_waiting (4)
      (5) test_continue (5)
      (6) test_thread_deleted (6)
      (7) test_thread_created (7)
    
    Select item: 6 ... 番号を入力する
    ----
    bundle exec ruby ./test/test_thread_history_display.rb -n test_thread_deleted ... 実際に実行されるコマンド
    ----
    Run options: -n test_thread_deleted --seed 62390
    
    # Running:
    
    .
    
    Finished in 0.001000s, 999.5052 runs/s, 1999.0104 assertions/s.
    
    1 runs, 2 assertions, 0 failures, 0 errors, 0 skips
    

    출처


    10분 정도 아무렇게나 쓴 것이라 항목에 따라 작동이 안 될 수도 있지만 필요하면 매번 수정할 수 있다.
    # minitest_runner.rb
    
    def select_item(title, items)
      puts "----"
      puts "#{title}:"
    
      # 候補一覧を表示
      items
        .map { |item| item.gsub("/", " / ") } # パスの区切りを見やすく
        .each_with_index { |item, i| puts "  (#{i}) #{item} (#{i})" }
    
      # ユーザの入力を受け取る
      puts ""
      print "Select item: "
      input = $stdin.gets
    
      raise if /\d+/ !~ input
    
      items[input.to_i]
    end
    
    def select_file(idx)
      files = Dir.glob("./test/**/test_*.rb").sort
    
      if idx
        files[idx.to_i]
      else
        select_item("files", files)
      end
    end
    
    def select_method(file, idx)
      method_lines =
        File.read(file).each_line
          .select { |line| /def test_.+/ =~ line }
          .map { |line| line.sub(/def /, "").strip }
    
      method_line =
        if idx
          method_lines[idx.to_i]
        else
          select_item("methods", method_lines)
        end
    
      md = method_line.match(/(test_[a-z0-9_]+)/)
      md[1]
    end
    
    # --------------------------------
    
    file_idx, method_idx = ARGV
    
    file = select_file(file_idx)
    method = select_method(file, method_idx)
    
    cmd = ""
    cmd << "bundle exec " if File.exist?("./Gemfile")
    cmd << "ruby #{file} -n #{method}"
    
    puts "----"
    puts cmd
    puts "----"
    
    system cmd
    exit $?.exitstatus unless $?.success?
    

    루비와 관련된 기타 내용


    https://memo88.hatenablog.com/archive/category/Ruby

    좋은 웹페이지 즐겨찾기