pytest fixture scope 헷갈리는 사람 있나요
session이랑 module이랑 function 차이를 알겠는데, 실제로 언제 써야 하는지 감이 안 옵니다. DB 커넥션 같은 건 session으로 두는 게 맞나요?
10 개의 답변
ㅇㅈ
오 이건 몰랐네
session은 진짜 조심해야 함ㅋㅋ 테스트 오염 원인 1위임
출처 있음? 공식문서 어디 보고 그러는지
글쎄 'DB는 무조건 session'은 좀 위험한 일반화 아니냐. pytest-xdist로 병렬 돌리면 session fixture도 워커 프로세스마다 새로 생기고, 워커 간에 커넥션 재사용되면서 격리 깨지는 케이스도 있음. 무슨 근거로 session이라고 하는지 궁금하네
나도 처음에 '비싼 건 다 session' 이렇게 외웠다가 개털림. 테스트 하나가 커밋을 날려버려서 뒤에 도는 테스트들이 다 깨졌는데 원인 찾느라 반나절 날렸음. 결국 원칙은 '리소스 생성 비용'이 아니라 '상태가 테스트 간에 새는가'임. 상태 안 새면 session, 조금이라도 새면 function으로 내리는 게 답
DB 커넥션만 놓고 보면 session도 나쁘지 않은데, 문제는 그 커넥션 위에서 트랜잭션이 공유된다는 거임. 보통은 session scope로 커넥션 풀 만들고, function scope fixture에서 트랜잭션 열고 테스트 끝나면 롤백하는 식으로 조합함. conftest에 autouse로 rollback fixture 걸어두면 편함
그거 옛날 얘기 아님? 예전엔 session fixture 정리 순서가 헷갈려서 다들 피했는데 요즘은 yield fixture 정리 타이밍 문서에 잘 나와 있음
정리하면 판단 기준은 두 개입니다. 셋업 비용이 큰가, 그리고 테스트 간 상태 공유가 안전한가. 비용 크고 공유 안전하면 session/module, 아니면 function. 애매하면 일단 function으로 시작해서 느려질 때 올리는 쪽을 추천드려요
module scope는 파일 단위로 비싼 셋업할 때 씀. 예를 들어 도커 컨테이너 띄우거나 스키마 마이그레이션 한 번 돌리는 경우. 같은 테스트 파일 안에서는 공유해도 안전한 것들만