Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Minitest 작동 방식에 대한 빠른 분석

미니테스트가 무엇인가요?

Minitest는 Ruby 테스트 라이브러리입니다. , 코드 TDD 스타일에 대한 테스트를 작성할 수 있습니다.

Rails &DHH가 즐겨 사용하는 기본 테스트 프레임워크입니다.

일부 사람들은 단순성과 주요 대안(RSpec)에 비해 코드가 적기 때문에 선호합니다.

이 사진에서 볼 수 있듯이 :

Minitest 작동 방식에 대한 빠른 분석

이제 이 게시물은 어떤 것을 선택해야 하고 어떤 것이 '더 낫다'는 이야기가 아닙니다.

이 게시물은 Minitest 작동 방식에 관한 것입니다. .

<블록 인용>

궁금한 점이 있으면 가장 좋아하는 것을 사용하세요. 하지만 두 가지 모두에 익숙해야 합니다. 🙂

작동 방식을 배우고 싶다면 이 게시물을 즐깁니다...

가장 좋아하는 테스트 라이브러리가 무엇이든 상관없이!

내부를 살펴봅시다

사람들이 (저를 포함하여) 추천하는 것 중 하나는 작동 방식을 배울 수 있는 좋은 방법이기 때문에 소스 코드를 읽는 것입니다. 또한 이전에는 볼 수 없었던 새로운 Ruby 트릭을 배울 수 있는 좋은 방법입니다.

그것이 제가 Minitest로 했던 일이며 제가 배운 것을 여러분과 공유할 것입니다.

실제 테스트 코드로 시작하여 이것이 Minitest가 수행하는 방식과 어떤 관련이 있는지 논의할 수 있습니다.

class Thingy < Minitest::Test
  def test_it_works
    assert_equal 1, 1
  end
end

그렇다면 Minitest는 이러한 테스트 방법(예:test_it_works ) 및 실행하시겠습니까?

대답은 약간의 메타프로그래밍 '마법'입니다.

def self.methods_matching(re)
  public_instance_methods(true).grep(re).map(&:to_s)
end

이것은 Runnable에서 가져옵니다. lib/minitest.rb에 정의된 클래스 . 이 코드는 현재 클래스에 대한 모든 인스턴스 메소드를 찾고 정규 표현식과 일치하는 메소드를 선택합니다.

따라서 methods_matching(/^test_/)을 호출하면 test_로 시작하는 모든 메서드 이름이 포함된 배열을 얻습니다. .

미니테스트의 작동 원리

Minitest는 다음 test_를 찾습니다. 메소드를 호출한 다음 호출합니다.

이는 lib/minitest/test.rb에서 발생합니다. 파일(좀 더 구체적으로 말하면 runnable_methods 메소드 목록도 무작위 순서로 반환합니다.

중요점 :
이것은 Minitest::Test이기 때문에 작동합니다. Runnable의 하위 클래스입니다. .

퍼즐의 마지막 조각은 run입니다. Runnable의 클래스 메서드 , 추가 필터링을 수행한 다음 run_one_method를 호출합니다. 모든 메서드 이름 및 리포터 개체와 함께.

코드는 다음과 같습니다. :

filtered_methods.each do |method_name|
  run_one_method self, method_name, reporter
end

그리고 이것은 run을 호출하는 것으로 끝납니다. Minitest::Test의 인스턴스 메서드 :

capture_exceptions do
  before_setup; setup; after_setup

  self.send self.name
end

Send는 문자열이나 기호를 사용하여 모든 개체에서 다른 메서드를 호출할 수 있는 메타프로그래밍 메서드입니다.

capture_exceptions 블록은 코드에서 발생한 테스트 실패 및 예외를 기록하는 데 사용됩니다.

def capture_exceptions # :nodoc:
  yield
rescue *PASSTHROUGH_EXCEPTIONS
  raise
rescue Assertion => e
  self.failures << e
rescue Exception => e
  self.failures << UnexpectedError.new(e)
end

이것이 내가 코드를 읽고 읽고 있는 코드의 한 측면이나 기능에 집중한 다음 양파처럼 레이어를 계속 벗겨내는 방법입니다.

이 yield 키워드와 같이 무엇을 의미하는지 모르는 경우 찾아보십시오.

이는 학습 과정의 일부입니다!

결론

이 게시물에서 Minitest가 메타프로그래밍을 사용하여 테스트 방법을 찾고 호출하는 방법을 배웠습니다. 또한 테스트 오류 및 예외가 보고를 위해 배열로 캡처되는 방법도 배웠습니다.

이런 종류의 "코드 분석" 기사가 마음에 드십니까?

댓글로 알려주세요 🙂

또한 좋아하는 소셜 네트워크에 공유하는 것을 잊지 마세요 기술을 향상시키려는 7000명 이상의 Ruby 개발자가 아직 없다면 아래 뉴스레터를 구독하세요!