Feat: 테스트별 쿼리 수 상한을 둘 수 있게 한다 - #116
Merged
Merged
Conversation
손으로 적는 어서션은 한 테스트의 정확한 수를 말한다. 그래서 도입 비용이 테스트 개수에 비례하고, 테스트가 이미 수백 개면 못 들어간다. 상한은 **모든 테스트에 대해 대략의 수**를 말하고 어느 테스트에도 아무것도 안 적는다. `query-counter.max-queries.per-test` 다. 잡는 것이 어서션과 다르다. 반복문 안에서 리포지토리를 부르면 쿼리 3개가 200개가 되는데 그것이 어느 테스트에서 일어나든 잡는다. 3개가 12개로 조용히 늘어나는 것은 쓸만한 상한 아래에 머무른다. 그건 괜찮다 — 상한은 폭주를 막는 그물이고 회귀 검사가 아니다. `query-counter.max-queries.report` 를 함께 둔 이유가 있다. 상한을 어림수로 잡으면 지금 통과하는 테스트가 깨지거나 아무것도 안 걸린다. 보고 모드로 한 번 돌려 최대값을 보고 정하는 것이 맞다. **보고가 조용히 안 보이는 구성이 있다.** 테스트 설정에서 `logging.level.root: warn` 을 두는 프로젝트가 흔하고 그러면 info 보고가 걸러진다. 실제 프로젝트에 켜 봤더니 그렇게 됐다. 켰는데 아무 일도 없는 것으로 읽히므로, 로거의 info 가 닫혀 있으면 경고로 한 번 알린다. 설정 전달은 N+1 모드와 같은 경로다. AutoConfig 가 읽어 리스너까지 넘기고 리스너가 ThreadLocal 에 실어 나른다. 판정은 어서션과 N+1 다음에 부른다. 그쪽이 더 구체적인 말을 하므로 먼저 실패해야 한다. 실제 프로젝트(테스트 164개)에서 확인했다. 보고 모드에서 최대 27, 중앙 19 가 나왔고, 같은 스위트를 두 번 돌려 75개 테스트의 수가 하나도 다르지 않은 것도 확인했다. 상한 20 으로 두면 28개가 걸리고 50 으로 두면 전부 통과한다. 테스트 준비 과정의 TRUNCATE 같은 쿼리도 함께 세지므로 그 사실을 README 두 벌에 적었다. 테스트 열 개를 더했다. 지원 버전 셋을 로컬에서 확인했다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request
Related Issue
Summary
query-counter.max-queries.per-test로 한 테스트가 쓸 수 있는 쿼리 수의 상한을 둔다. 테스트에는 아무것도 안 적는다.Details
어서션과 무엇이 다른가
select(3)3에서 12로 조용히 늘어나는 것은 쓸만한 상한 아래에 머무른다. 그건 괜찮다. 상한은 폭주를 막는 그물이고 회귀 검사가 아니다. 반복문 안에서 리포지토리를 부르면 쿼리가 데이터 건수만큼 붙는데, 그것이 어느 테스트에서 일어나든 잡는다.
보고 모드를 함께 둔 이유
상한을 어림수로 잡으면 둘 중 하나가 된다. 지금 통과하는 테스트가 깨지거나, 아무것도 안 걸린다.
query-counter.max-queries.report로 한 번 돌리면 테스트마다 한 줄씩 나온다. 그 최대값을 보고 정하면 된다.보고가 조용히 안 보이는 구성이 있었다
실제 프로젝트에 켜 봤더니 한 줄도 안 나왔다. 그 프로젝트 테스트 설정이
logging.level.root: warn이어서 info 보고가 걸러진 것이다. 흔한 구성이다.켰는데 아무 일도 없는 것으로 읽히므로, 로거의 info 가 닫혀 있으면 경고로 한 번 알린다.
한 번만 알리는 표시로
AtomicBoolean을 쓴다. 테스트 사이에 되돌릴 필요가 없는 값이라 리셋되지 않아 문제가 됐던 예전의 static 플래그와 성질이 다르다. 그 차이를 주석에 적었다.배선
설정 전달은 N+1 모드와 같은 경로다.
AutoConfig가 읽어 리스너까지 넘기고, 리스너가 기록할 때ThreadLocal에 실어 나른다. 리스너가 애플리케이션 컨텍스트를 만지지 않는다는 제약이 그대로 지켜진다.판정은 어서션과 N+1 다음에 부른다. 그쪽이 더 구체적인 말을 하므로 먼저 실패해야 한다.
확인
실제 프로젝트(Gradle, Boot 4.0.5, 테스트 164개)에서 봤다.
실패 메시지 예다.
OTHERS=14가 그 프로젝트의 테이블 비우기 리스너가 날리는 것이다. 테스트 준비 과정의 쿼리도 함께 세진다. 상한을 정할 때 알아야 하는 사실이라 README 두 벌에 적었다.로컬에서 지원 범위 셋(3.0.0, 3.5.16, 4.1.0)을 모두 빌드했다.
테스트
열 개를 더했다.