실패할 때까지 취성 테스트 재시도

취성 테스트는 일부 시간에만 실패하는 테스트입니다. 이로 인해 실패의 원인이 되는 시나리오를 재현하기 어려울 수 있습니다.

이러한 취성 테스트는 모든 종류의 이유로 실패할 수 있으며 그 중 일부는 다음과 같습니다.
  • 테스트의 무작위성 또는 부족. 예: 동일한 숫자가 두 번 생성되어 데이터베이스 또는 메모리의 개체 ID에 대한 충돌이 발생합니다.
  • 실행 순서를 테스트합니다. 예: 먼저 실행되는 테스트가 다른 테스트의 동작에 영향을 줍니다. 테스트 상태가 다른 테스트로 누출됩니다. 이 시나리오에서는 RSpec bisect 을 사용하는 것을 좋아합니다.
  • 앱 버그. 일부 시간에만 발생하는 실제 앱 특정 버그입니다. 원인이 무엇입니까? 알아내는 유일한 방법은 실패한 테스트를 받고 디버깅을 시작하는 것입니다.

  • 우리는 이러한 취약한 테스트를 수정하고 싶지만 취약한 테스트를 디버깅할 때의 문제는 원할 때 실패하지 않는다는 것입니다. 테스트는 실패 없이 100번 실행할 수 있으며 101번만 실패할 수 있습니다. 수동으로 101번 재시도하는 것은 시간이 많이 걸리고 재미도 없습니다.

    내가 하고 있는 일은 계속 재시도하고 싶은 명령 주위에 while -문을 짜내는 것인데, 번거롭고 오타가 쉽게 만들어졌습니다. 대신, 이를 위해 작은 실행 파일을 사용합시다.

    실행 파일 재시도



    테스트의 "취약함"에 대한 정확한 이유가 무엇인지 확실하지 않으면 "실패할 때까지 재시도"도우미 실행 파일until-fail을 간단히 가져옵니다. 이것은 실패가 발생할 때까지 계속 반복되는 주어진 명령을 둘러싼 매우 작은 래퍼입니다.

    Retry a command until it fails
    
    Usage:
    
      $ until-fail true
      # Will repeat forever
    
      $ until-fail false
      # Fails at the first iteration and breaks out of the retry loop
    
      $ until-fail ruby -e "rand(0..1) == 1 ? (puts 'failed'; exit(1)) : (puts 'success')"
      # Fails randomly and breaks out of the retry loop when it fails
    

    until-fail 실행 파일은 추가 조사를 원하는 실패 시나리오가 발생할 때까지 주어진 명령(우리의 경우 테스트)을 반복합니다. 이렇게 하면 깨진 시나리오에 있는 동안 취성 테스트를 디버그할 수 있습니다. 그 새로운 정보로 우리는 그 테스트를 고칠 수 있기를 바랍니다.

    테스트 실패 컨텍스트에 대한 추가 정보를 제공하기 위해 로깅 또는 인쇄 문과 결합되어 이제 취성 테스트를 디버그하기가 더 쉬워집니다.

    $ until-fail ruby tests/brittle_test.rb
    Retry #1
    DEBUG: User#accepted_terms_and_conditions == true
    Success!
    
    Retry #2
    DEBUG: User#accepted_terms_and_conditions == true
    Success!
    
    ...
    
    Retry #100
    DEBUG: User#accepted_terms_and_conditions == true
    Success!
    
    Retry #101
    DEBUG: User#accepted_terms_and_conditions == false
    Failure/Error: expect(signed_up_user_names).to include("Tom")
      expected signed up users to include "Tom"
    


    어디에서 찾을 수 있습니까?



    스크립트를 사용할 수 있습니다in this gist.

    Bash 및 ZSH로 테스트한 셸에서 실행할 수 있는 작은 Bash 실행 파일입니다.

    파일을 다운로드하고 실행chmod +x until-fail하여 실행 가능하게 만드십시오. $PATH를 호출하고 재시도할 명령을 전달하여 모든 위치에서 실행할 수 있도록 until-fail에 지정된 위치로 이동합니다.

    $ until-fail ruby some_file.rb
    $ until-fail ruby tests/brittle_test.rb
    


    자세한 내용은 이 게시물 시작을 참조하십시오how to create your own executables.

    프라이와 함께



    이 자동 재시도 방법을 Ruby에서 잘 배치된pry 문과 함께 사용하여 오류가 발생할 때 콘솔을 엽니다.

    $ until-fail ruby tests/brittle_test.rb
    ...
    
    Retry #101
    From: /path/to/project/tests/brittle_test.rb:11 :
    
         7: it "includes newly signed up user" do
         8:   begin
         9:     expect(signed_up_user_names).to include("Tom")
        10:   rescue Exception => e
     => 11:     binding.pry
        12:     raise e # Reraise the failure so the retry script stops
        13:   end
        14: end
    


    RSpec raises an Exception on assertion failures 때문에 rescue Exception 를 사용합니다. 구조는 일시적일 뿐이며 취성 테스트가 수정되면 제거해야 합니다.

    이제 until-fail 도우미에 래핑된 테스트 명령을 실행하고 컴퓨터에서 멀어질 수 있습니다. 잠시 후 다시 돌아올 때 실패한 시나리오 디버깅을 시작할 수 있도록 pry 콘솔이 준비되기를 바랍니다.


    취성 테스트를 디버깅하는 동안 이 작은until-fail 도우미를 많이 사용합니다. 확실히 로컬에서 취성 테스트를 더 쉽게 재현할 수 있습니다. 테스트에서 무작위성을 제거하고 테스트 간 상태를 정리했으며 취약한 테스트의 원인이 된 다양한 앱별 시나리오를 제거했습니다.

    그것을 시도하고 도움이 되었는지 알려주세요!

    좋은 웹페이지 즐겨찾기