미니테스트가 무엇인가요?
Minitest는 Ruby 테스트 라이브러리입니다. , 코드 TDD 스타일에 대한 테스트를 작성할 수 있습니다.
Rails &DHH가 즐겨 사용하는 기본 테스트 프레임워크입니다.
일부 사람들은 단순성과 주요 대안(RSpec)에 비해 코드가 적기 때문에 선호합니다.
이 사진에서 볼 수 있듯이 :
이제 이 게시물은 어떤 것을 선택해야 하고 어떤 것이 '더 낫다'는 이야기가 아닙니다.
이 게시물은 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 개발자가 아직 없다면 아래 뉴스레터를 구독하세요!