실패할 때까지 취성 테스트 재시도
5136 단어 productivitybashrubytesting
이러한 취성 테스트는 모든 종류의 이유로 실패할 수 있으며 그 중 일부는 다음과 같습니다.
우리는 이러한 취약한 테스트를 수정하고 싶지만 취약한 테스트를 디버깅할 때의 문제는 원할 때 실패하지 않는다는 것입니다. 테스트는 실패 없이 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
도우미를 많이 사용합니다. 확실히 로컬에서 취성 테스트를 더 쉽게 재현할 수 있습니다. 테스트에서 무작위성을 제거하고 테스트 간 상태를 정리했으며 취약한 테스트의 원인이 된 다양한 앱별 시나리오를 제거했습니다.그것을 시도하고 도움이 되었는지 알려주세요!
Reference
이 문제에 관하여(실패할 때까지 취성 테스트 재시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tombruijn/retry-brittle-tests-until-they-fail-3134텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)