테스트 코드 완성!

2023년 11월 30일 목요일

Today I Learned

날짜

2023년 11월 30일 목요일

내용

계속해서 테스트 코드를 고쳤고 2차로 완성했다. 화요일에 완성했다고 판단하여 PR을 올렸는데, 그떄 받은 코멘트를 피드백하여 수정했다. 여러 오류들을 수정해가는 과정을 정리하였다.

모든 경우를 순환

위젯을 생성하는 함수를 테스트해야 했다. 위젯의 종류와 설치 위치에 따라 다양한 경우의 수가 존재할 수 있는데, 기존에는 무작위로 하나를 골라 테스트하고 결과를 도출시켰다. 이것을 pytest.mark.parameterize를 이용해 모든 경우의 수를 검증하도록 수정하였다.

위젯 타입에 대한 클래스가 워낙 많았고 실제로는 다르게 처리되야 할 타입들도 존재하다보니 오류가 발생하였다. 따라서 어떤 타입들이 살짞 다른 로직을 거쳐야 하는지 파악하였다. 결정적으로, 검증 대상은 위젯 타입의 이름을 포함하는 html 파일이 존재 하는가를 기준으로 성공 여부를 판단하고 있었다.

따라서 이와 다른 로직이 필요한 타입들은 경우의 수에서 제외하였다. 만약 필요하다면 별개의 테스트 함수가 필요하다고 생각했기 떄문이다. 한 테스트 함수에서 여러 개의 Flow를 검증하는 것은 테스트 함수가 복잡해지는 것 뿐만 아니라 예상 외의 오류에 대한 위험도가 너무 높아질 수 있다고 판단했다.

위젯의 옵션 설정

기존에 위젯의 옵션은 내가 임의의 값을 입력해놨다. 하지만 위젯 옵션을 기본 설정으로 만들어 주는 생성자가 있다는 것을 늦게 발견하여, 이를 이용하도록 바꾸었다. 하지만 위젯의 옵션 내부에 custom_widget_option가 필요한데, 이를 생성해주는 함수는 없어서 임의로 설정했다.

위젯의 Localization_option 문제

일부 타입들이 localization_option이 존재하지 않는다고 오류가 발생하였다.

  1. 추론 : get_widget() 함수 내에는 get_widget_localization_option() 함수가 있다. 기존의 widget_options에 localization_option을 추가하는 함수이다. 이때 widget_option의 shop_id와 is_active를 통해 localization_option가 존재하는지 확인한다. 만약 shop_id와 is_active 값으로 localization_option을 찾을 수 없다면 widget_options에 localization_option을 추가할 수 없기 떄문에 오류가 발생할 것이다. 따라서 test용 DB에서 localization_option의 shop_id와 is_active를 찾아서 widget_options에 알맞게 배당하도록 코드를 수정하여 해결한다
  2. 검증 : test DB를 삭제하는 코드를 각주로 만들어 DB를 남겼다. model.py에 정의된대로 widget_localization에 localization_option이 있어야 한다. 들어가보니 아무런 레코드가 없었다. 따라서 적절한 widget_localization 레코드를 생성하는 코드를 추가하기로 하였다. 또한 shop_id는 1로 고정해주었다.
  3. 적용 : classes에서 create_initial_widget_localization_setting 을 발견했다. widget_option과 마찬가지로 이를 이용해 만들었다. test_get_widget 은 모든 위젯 타입을 검사하기 때문에 여러분 호출되는데, widget_localization 레코드가 여러개 생성되어 있으면 오류가 발생한다. 따라서 테스트 함수가 호출되면 기존에 존재하던 widget_localization을 모두 삭제하고 시작하도록 구현하였더니 해결되었다.

KeyError 관련 오류

KeyError: ‘Based on ## Reviews’ 라는 에러가 생성되었다. Localization_option 의 property중 localization_dictionary 라는 property가 있었다. 해당 속성은 항상 key가 “Based on ## Reviews” 라는 형태를 가지는 걸로 코드가 작성되어있었다. 따라서 임의의 값이 아닌 정해진 규격대로 설정하여 해결하였다.

회고

생각보다 너무 오래 질질 끌었다. 특히 자꾸 이것저것 건드리다보니 같은 곳을 맴도는 경우가 많았다. 나중에야 노션에 적으면서 차근차근 가설을 세우고 증명하는 방법을 써보니 정리도 깔끔하게 됐고 스스로 납득도 됐다. 굿. 맘편히 연차 떠나야지