[TIL] 26-03-05

2026. 3. 5. 18:04·TIL

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
'TIL' 카테고리의 다른 글
  • [API] 기상청 API 이용방법
  • [TIL] 26-03-04
byhy0
byhy0
byhy0 님의 블로그 입니다.
  • byhy0
    byhy0 님의 블로그
    byhy0
  • 전체
    오늘
    어제
    • 분류 전체보기 (62)
      • T아카데미 (4)
      • Project (2)
      • Airflow (4)
      • Python (16)
        • Django (0)
      • Java (1)
      • Spring (4)
        • Board Project (3)
      • SQL (3)
      • Docker (1)
      • 클라우드 (2)
      • Error (3)
      • Git (5)
      • 코딩테스트 (12)
        • SQL (5)
        • Python (7)
      • TIL (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    venv #파이썬 가상환경 #가상환경
    티스토리챌린지
    T아카데미 #SK플래닛 #회고 #1주차
    #Python #정규표현식 #Regex #웹크롤링 #데이터처리
    push #pull #git연동
    Spring
    vscode #git #git연동법
    BigQuery #SQL
    python #pytest #테스트
    programmers #SQL #코딩테스트
    API 요청 #API
    T아카데미 #면접 #데이터 엔지니어 #K-Digital Traning
    오블완
    programmers # 코딩테스트 #sql
    T아카데미 #2주차 회고 #데이터 엔지니어 2기
    git #github #repository 생성
    T아카데미#SK플래닛#데이터엔지니어2기
    Git #설치법
    게시판
    #클라우드 #클라우드컴퓨팅 #CloudComputing #온프레미스 #CS기초 #IT인프라 #서버
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
byhy0
[TIL] 26-03-05
상단으로

티스토리툴바