봄이 좋긴 좋다 / 마음 고쳐먹기 / 단위 테스트 스터디
1. 봄이 좋긴 좋다: 오밀조밀 내 일상
2. 마음 고쳐먹기: 내 감정 속이지도 말기
3. 단위 테스트 스터디: AAA 패턴
월요일, 날씨가 쨍- 했다. 벚꽃은 이미 주말에 만개해서 일찍이 봄의 시작을 알렸고 월요일은 주말의 활기를 유지하려는 듯 보였다. 기분 좋은 날씨에 보답하고 싶어 아끼는 치마를 꺼내 입고 반팔에 가디건 하나를 걸치곤 집을 나섰다.
이어폰을 꽂고 에드시런의 Photograph를 틀었다. 놀이터 주위를 둘러싼 벚꽃과 분홍색 길이 된 바닥, 피부로 쬐이는 햇살, 듣고 있던 노래까지. 장면이 너무 아름다워 벅찼다.
아, 행복해.
손을 앞으로 뻗어 햇빛과 하이파이브하는 기분을 느꼈다가 벚꽃 잎 같은 손톱을 보고 혼자 흐뭇해서 웃었다가, 들뜬 마음에 폴짝 뛰기도 했다. 이렇게 즐거운 출근길이라니!
오후엔 번개로 친구를 만나 ZARA 매장 구경하다 가방도 하나 사고 교보문고 가서 읽고 싶던 책도 샀다. 적으면서 돌아보니 10년이 다 되어가는 이 친구는 어떻게 이렇게 만날 때마다 좋을까? 라는 생각이 들었다.
별 특별한 얘기를 한 것도 아니고 특별한 곳을 간 것도 아닌데 그냥 벤치에 앉아서 친구가 사다준 마들렌 먹으며 일상 얘기한 것뿐인데 뭐가 그리 좋은지 지금도 회상하며 행복해하고 있다. 이런 친구가 있다는 게 새삼 참 감사하다. 이번엔 갑자기 만나게 된 거라 저녁을 같이 못 먹어서 다음엔 좀 더 일찍 만나 저녁도 먹고 얘기도 더 많이 하기로 했다.
우리가 빛의 속도로 갈 수 없다면, 이 책은 전에 얘기했던 귀여운 동료가 도서관에서 빌려다 줬었는데 시간 안에 다 못 읽어서 아예 사버렸다. SF소설 특징인가 싶을 정도로 이 책과 천 개의 파랑 둘 다 표지가 너무 예쁘다. 소장할 만한 책.
이번 주엔 비가 오기도 하고 피로감이 심해 재택을 했다.
점심에 간단히 토스트 구워서 땅콩잼이랑 딸기잼을 발라 먹었다. 나만의 꿀팁인데 땅콩잼 딸기잼 같이 먹으면 맛은 고소하고 달달하면서 식감은 꾸덕하고 촉촉해 아주 맛있다. 토스트는 굽고 나서 30초 정도 식힌 후 잼을 바르는 게 좋다. 아니면 눅눅해질 수 있다.
새 프로젝트 시작하는 시점에 있다는 말을 1분기 회고 때 했었다. 그때 했던 많은 포부 중 ‘부정적인 감정도 외면하지 않고 과감히 받아들이기’가 목표에 있었는데 벌써 2분기 바람을 한 가지 어겨버렸다.
새 프로젝트를 시작하며 나도 모르게 스트레스를 받고 있었던 모양이다. 몸에서 이상신호들이 나타났다. 몇 주전부터 식욕이 없어졌다거나 부정출혈이 있다거나 귀가 아프다거나 하는 것들이었다. 그제야 날 다시 돌아봤다. 불편한 감정을 속이고 있었구나 싶었다.
나는 지금 내 상태에서 어떻게 하는 게 맞을지 혼란스러웠다. 바뀐 업무에 빠르게 적응하는 게 맞는 건지 아니면 좀 더 원하는 업무를 요청하는 게 맞는 건지 지금 이 서비스에 애착을 얼마나 가져야 하는지 등 생각이 많고 혼란스러웠다. 답이 있는 게 아니니 누구에게 털어놓기도 조언을 구하기도 어렵고 배부른 소리처럼 들릴까도 싶어 질문을 삼켰다.
그러다 마침 다른 파트 회사 선배와 근황 얘기할 시간이 생겨 내 혼란스러움을 살짝 말했다. 감사하게도 선배가 말해준 경험과 느낀 점들에서 많은 공감과 위로를 받았다. 가장 위로가 됐던 얘기는 커리어에 관해 우리 팀장님이 가지셨던 태도였다.
어느 회사든 본인이 원하는 커리어, 원하는 업무만 할 순 없을 것이다.
그 과정에서 보이는 태도가 중요한데 보고 들은 팀장님은 업무가 180도 바뀌어도 묵묵히 그 일을 하셨다고 한다.
그 상황에서 배울 점을 찾아 나가시다 보니 지금 현재 위치에 계신 게 아닐까 한다.
비슷한 커리어 고민인 거 같은데 마음이 좀 편해지면 좋겠다.
그제야 팀장님이 나에게 해주셨던 칭찬이 생각났다. 뭐든 배우려 하고 기술에 편식을 안 한다는 점을 높게 사주셨었다. 난 그새 그걸 까먹고 혼란스러워했다. 지금 내가 뭘 해야 할지 팀장님은 사실 말해주셨던 거였다. 그냥 지금 맡겨진 거 하면 된다고.
맘이 한결 편해졌다. 그냥 하면 되는구나. 나 또 최고의 선택하려고 스트레스받았구나. 싶으면서 지금 자리에서 최선을 다해야겠다고 마음을 딱 고쳐먹었다. 역시 선배님 짱.
물론 아마 이제 다른 방면으로 스트레스를 받긴 할 것이다. 새로운 언어 새로운 기술 새로운 지식들을 마구 습득해야 할 테니까. 하지만 이게 내가 더 큰 그릇이 되는 과정이라 믿고 하려고 한다. 이 지식이 나중에 나에게 어떤 도움을 줄지 모르는 거니까. 이렇게 다방면으로 접하다 보면 기술에 대한 러닝커브가 한 층 짧아질 것도 같고! 긍정적으로 생각하자!
요새 단위 테스트 책을 스터디하고 있다.
사실 우리 조직에서는 테스트 코드를 안 쓰고 있어서 처음 책을 접하고 읽을 때 이해 안 가는 부분이 많았는데 3주 차에 들어서니 이제 조금 이해가 갔다. 쓰지도 않는데 왜 공부하냐 하면, 내가 얼른 공부해서 우리 조직에도 도입시켜야지 마음먹고 하는 중이다.
이번 주는 3장 단위 테스트 구조에 대한 내용이었다. 내가 공부해갈 부분은 3.1 단위 테스트를 구성하는 방법과 3.4 단위 테스트 명명법이었다. 다른 부분들도 내용이 좋았지만 개인적으로 내가 맡았던 3.1 내용이 정말 좋았다.
단위 테스트를 구성할 때는 AAA 패턴을 기억하면 된다. 한 테스트에 준비(Arrange) - 실행(Act) - 검증(Assert) 세 구절로 나눠 작성한다.
Arrange 단계에서 SUT와 해당 의존성들을 원하는 상태로 만들어두고
Act 단계에서 SUT의 메서드를 호출하고
Assert 단계에서 결과를 검증한다.
(SUT는 System under Test의 약자로 한국어로 하면 테스트 대상 시스템이다. 의미적으로 보자면 테스트의 대상이 되는 즉, 테스트에서 호출한 클래스 중 테스트할 대상 메서드가 있는 클래스. 정도로 이해하면 될 것 같다.)
이때, 기억해야 할 유의사항들이 있다. 내용들이 길어서 짧게 적어보겠다.
여러 개의 AAA 구절을 피해야 한다. 테스트가 한 번에 너무 많은 것을 검증하려고 한다는 의미이기 때문이다.
테스트 내 if문도 안티 패턴이다. 분기가 없는 일련의 과정이어야 한다.
준비 구절은 다른 두 구절에 비해 일반적으로 가장 크다. 하지만 훨씬 크게 되면 비공개 메서드나 별도의 팩토리 클래스로 빼는 게 좋다.
또 실행 구절은 보통 코드 한 줄이다. 만약 두 줄 이상일 경우 SUT의 공개 API에 문제가 있을 수 있다. 이건 예시가 이해가 빠른데, API가 하나의 코드로 다시 말해 하나의 실행으로 원하는 결과를 모두 도출할 수 있도록 애초에 구성되어야 한다.
종료 구절을 쓰기도 한다. 테스트에 의해 작성된 파일을 지우거나 DB 연결을 종료하고자 할 때 필요하다. 하지만 이는 주로 통합 테스트일 때 얘기일 것으로 추측된다. 따라서 단위 테스트 시에는 공유 의존성 대신 테스트 대역으로 대체될 것이기 때문에 대부분 필요가 없다.
SUT를 구별할 땐 다른 의존성들과 헷갈리지 않게 SUT 클래스의 이름을 sut로 받는 게 좋다.
-
또 책에서는 .NET에서 사용하는 xUnit 프레임워크를 사용했는데 스터디원들과 얘기해 본 결과 프론트 쪽은 Jest / Vitest 를, 백엔드 쪽은 JUnit / Kotest 정도를 사용하는 것 같았다.
테스트 간 테스트 픽스쳐 재사용 시에는 생성자 사용보다는 비공개 팩토리 메서드를 사용하는 것이 좋다. 생성자 사용은 테스트 간 결합도가 높고 가독성이 떨어지기 때문이다.
테스트 이름을 지을 때는 엄격한 명명 정책을 따르지 않고 비개발자들에게 시나리오를 설명하는 것처럼 지을 것을 당부했다.
매개변수화 된 테스트를 사용할 때도 있을 것이다. 나이에 따라 테스트를 해야 한다면 나이를 매개변수화 해서 랜덤하게 값을 넘겨 테스트할 수도 있을 것이다. 하지만 매개변수화된 테스트는 코드의 양은 줄지만 이해하는 비용은 늘어날 수 있다. 이럴 때 긍정적인 테스트는 고유 테스트로 분리하고 주로 예외적인 상황이 많은 부정적인 테스트들을 따로 분리하는 것이 좋다. 만약 동작이 너무 복잡하다면 매개변수화된 테스트를 사용하지 말라고 하기도 했다.
또 테스트 가독성을 위해 검증문 라이브러리를 사용하면 주어 - 행동 - 목적어 순으로 영어처럼 읽을 수 있어 좋다는 내용도 있었다.
여기까지 이번 주 에피소드를 나열했다. 휴. 호락호락하진 않지만 또 잘 해낼 나를 기대한다. 다들 화이팅!!