테스트 코드 작성

2024년 4월 4일 목요일

Today I Learned

날짜

2024년 4월 4일 목요일

내용

고객 체크

계속 고민했던대로, 고객에 대한 데이터를 얻기 위해 수정이 필요했다. 다른쪽에서도 비슷한 결의 문제가 발생했는데, 프론트에서 유저가 받아야 할 쿠폰이 무엇인지 알 수 없었다. 쿠폰을 받기위한 이벤트의 진행 과정은 프론트에서 개별적으로 발생하는 반면, 쿠폰은 서버에서만 처리하니 둘의 싱크가 안맞아서 발생하는 문제 같았다. 결국 쿠폰을 발급할 때, 고객이 로그인하도록 과정을 추가해야 했다.

테스트 코드

약 2시간을 투자해서 테스트 코드를 작성했다. 무려 몇개월 전에 만들었던 AI 관련된 기능들에 대해서 작성했다. 리뷰의 키워드를 분석하고 횟수를 계산하는 것, 긍정과 부정을 분류하는 것, 요약을 만드는 것 3가지를 만들어주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TestAI:
    # 키워드 추출, 횟수 계산 테스트
    def test_analyze_keyword_from_reviews(self):
		    # 테스트용 DB 세션을 시작하는 코드
        with TestingSessionWriteLocal() as db:
	          # 따로 정의하였는데, 테스트에 필요한 데이터 테이블을 초기화해주는 메서드
            set_factory_session(db)
            # 테스트를 진행할, id가 1인 shop을 설정
            factory_shop()
	          # 테스트용 분석 로그 생성
            analysis_log = factory_analysis_log()
            # 테스트용 리뷰 10개 생성(위에서 만든 로그와 관계를 맺어주기 위해 ID를 삽입함)
            imported_reviews = factory_import_review_from_aliexpress(analysis_log_id = analysis_log.id)
            db.commit()

            reviews = [ review.translation_content for review in imported_reviews ]
            result = analyze_keyword_from_reviews(reviews)
            assert ( result["positive_keywords"] and result["negative_keywords"] )
            db.rollback()

pytest는 파일명, 함수명에 test가 붙으면 하나의 유닛테스트 단위로 파악한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
============================== test session starts ===============================
platform linux -- Python 3.10.14, pytest-7.2.0, pluggy-1.0.0
rootdir: /code
plugins: tornasync-0.6.0.post2, Faker-18.5.1, trio-0.8.0, anyio-3.6.2, asyncio-0.21.0
asyncio: mode=strict
collected 70 items                                                               

tests/test_pytest.py ..................................................... [ 75%]
.................                                                          [100%]

================================ warnings summary ================================
src/database.py:56
  /code/src/database.py:56: MovedIn20Warning: Deprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. To prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". Set environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.  Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message. (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
    Base = declarative_base()

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
========================= 70 passed, 1 warning in 10.55s =========================

회고

우리 앱이 큰 기로에 놓여있나보다.