TIL (Today I Learned) - 2026.03.05
오늘 한 것
날씨 데이터 수집 프로젝트 - pytest 테스트 코드, saver.py, main.py 구현 완료
1. pytest 테스트 코드
설치
pip install pytest
pip freeze > requirements.txt
테스트 파일 구조
tests/
├── __init__.py
└── test_parser.py
test_parser.py
from src.parser import parse_weather
def test_parse_weather():
sample_data = {
"response": {
"body": {
"items": {
"item": [
{
"wf": "맑음",
"ta": "11",
"rnSt": 10
}
]
}
}
}
}
result = parse_weather(sample_data)
assert isinstance(result, list)
assert result[0]["wf"] == "맑음"
assert result[0]["ta"] == "11"
테스트 실행
pytest tests/test_parser.py -v
2. 오늘 배운 개념들
pytest 규칙
- 파일 이름은 test_ 로 시작해야 pytest가 인식
- 함수 이름도 test_ 로 시작해야 pytest가 인식
- assert 로 검증 (틀리면 자동으로 FAILED)
목업(mock) 데이터로 테스트하는 이유
- 실제 API 호출 없이 테스트 가능 → 빠르고 안정적
- 결과가 항상 같아서 검증이 쉬움
- 인터넷 없이도 테스트 가능
isinstance
isinstance(result, list) # result가 list 타입이면 True
isinstance(result, dict) # result가 dict 타입이면 True
TabError 주의
파이썬은 들여쓰기를 탭이랑 스페이스 섞으면 오류남 → 항상 스페이스 4칸으로 통일
3. saver.py 최종 코드
import logging
import csv
def save_weather(datas: list) -> None:
'''
파싱된 날씨 데이터를 CSV 파일로 저장
'''
if datas is None:
logging.error("넘어온 데이터가 없습니다")
return None
# utf-8-sig: 한글 깨짐 방지를 위한 인코딩
with open("data/weather.csv", "w", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["wf", "ta", "rnSt"])
for data in datas:
writer.writerow([data["wf"], data["ta"], data["rnSt"]])
csv.writer 사용법
writer = csv.writer(f)
writer.writerow(["wf", "ta", "rnSt"]) # 헤더 (첫 번째 행)
writer.writerow([data["wf"], data["ta"], data["rnSt"]]) # 데이터
4. main.py 최종 코드
from src.fetcher import fetch_weather
from src.parser import parse_weather
from src.saver import save_weather
if __name__ == "__main__":
city = input("날씨 정보를 원하는 도시를 작성하시오 : ")
data = fetch_weather(city)
if data is None:
print("데이터 수집 실패")
exit()
parsed_data = parse_weather(data)
if parsed_data is None:
print("데이터 파싱 실패")
exit()
save_weather(parsed_data)
5. 전체 파이프라인 흐름
사용자 입력 (도시명)
↓
fetch_weather() → 기상청 API 호출
↓
parse_weather() → 필요한 데이터만 추출
↓
save_weather() → CSV 파일로 저장
6. 커밋 태그 정리
태그 언제
| feat | 새로운 기능 추가 |
| fix | 버그 수정 |
| docs | 문서 수정 |
| refactor | 기능 변경 없이 코드 구조 개선 |
| chore | 라이브러리 설치, 설정 변경 등 잡일 |
| test | 테스트 코드 작성 |
7. 다음에 할 것
- 기술 블로그 회고 작성
- parser.py에서 빈 ta 값 처리 (item.get("ta", "N/A"))
- DB 연동 (CSV → PostgreSQL)
'TIL' 카테고리의 다른 글
| [API] 기상청 API 이용방법 (0) | 2026.03.08 |
|---|---|
| [TIL] 26-03-04 (0) | 2026.03.04 |