Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬 클래스
- 백준
- 99클럽 #99일지 #코딩테스트 #개발자스터디 #항해 #til
- 주니어개발자멘토링
- Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
- print("""
- 항해
- 항해플러스
- vscode cp949
- 코딩부트캠프후기
- 개발자사이드프로젝트
- cp949
- 파이썬 map 함수
- Til
- 99일지
- 개발자스터디
- 코딩테스트
- 파이썬
- 10430번
- 파이썬 sep
- EnvCommandError
- 파이썬 |
- print sep
- not a git repository
- 주니어개발자역량강화
- MomentumParameters
- 파이썬 int()
- fatal:not a git repository
- 항해99
- 99클럽
Archives
- Today
- Total
선발대
[원티드] 1주차 과제: (주)랩큐 / 테스트 코드 본문
과제 진행기간
- 2022년 6월 28일(화) ~ 2022년 7월 1일(금)
목적
- Open API 방식의 공공데이터를 수집, 가공해서 전달하는 REST API와 이를 요청하는 클라이언트 개발
사용하는 데이터
- 서울시 하수관로 수위 현황 / http://data.seoul.go.kr/dataList/OA-2527/S/1/datasetView.do
- 서울시 강우량 정보 / http://data.seoul.go.kr/dataList/OA-1168/S/1/datasetView.do
요구사항
- 72시간 내에 제출
- 클라이언트, 서버는 원하는 언어, 프레임워크로 개발해도 괜찮음. (우리는 Python, DRF)
- 결과는 JSON 형식으로 나오도록 함.
- 소스에 docstring 넣기
공부한 내용
01. 테스트 코드 작성(tests.py)
- 테스트 코드 작성법을 배웠다.
- 공식문서: https://docs.djangoproject.com/en/3.2/topics/testing/overview/
from django.test import RequestFactory, TestCase
from seoul.views import SeoulWaterLevelRainFallView, dict_gu_id, OPEN_API_KEY
import json, requests
class SeoulTest(TestCase):
def test_search_result(self):
'''
date : 2022-06-30
writer : 나
'''
url = '127.0.0.1/8000/api/seoul/gu-search'
factory = RequestFactory()
view = SeoulWaterLevelRainFallView.as_view()
request = factory.get(url)
for request_gu_name in dict_gu_id:
response = view(request, request_gu_name)
# 데이터가 없다면 detail 나옵니다. / detail이 있을 경우, continue로 진행합니다.
if 'detail' in response.data:
continue
gu_name = response.data['data']['gu_name']
avg_water_level = response.data['data']['avg_water_level']
# 검색 데이터와 응답한 데이터가 일치하는지 확인합니다.
self.assertIsNotNone(avg_water_level)
self.assertEquals(gu_name, request_gu_name)
self.assertEquals(response.status_code, 200)
# 올바른 type인지 확인합니다.
type_gu_name = type(gu_name)
type_avg_water_level = type(avg_water_level)
assert type_gu_name is str, 'gu_name이 string 타입이 아닙니다.'
assert type_avg_water_level is float, 'avg_water_level이 float 타입이 아닙니다.'
# rainguage_info의 개수는 지역마다 달라서 개수가 다르기 때문에 따로 작성하였습니다.
raingauge_info = response.data['data']['raingauge_info']
for raingauge_info_index in range(len(raingauge_info)):
raingauge_name = raingauge_info[raingauge_info_index]['raingauge_name']
sum_rain_fall = raingauge_info[raingauge_info_index]['sum_rain_fall']
# null 값이 아닌지 확인합니다. (null일 경우 에러 발생)
self.assertIsNotNone(raingauge_info)
self.assertIsNotNone(raingauge_name)
self.assertIsNotNone(sum_rain_fall)
# 올바른 type인지 확인합니다.
type_raingauge_info = type(raingauge_info)
type_rainguage_name = type(raingauge_name)
type_sum_rain_fall = type(sum_rain_fall)
assert type_raingauge_info is list, 'raingauge_info가 list 타입이 아닙니다.'
assert type_rainguage_name is str, 'rainguage_name이 str 타입이 아닙니다.'
assert type_sum_rain_fall is float, 'sum_rain_fall이 float 타입이 아닙니다.'
02. Open API 활용법
- 예시로 과제에 주어진 서울 열린데이터 광장에 접속하면 사용법이 나와있음.
- 우선 사용하기 전에 인증키를 받아야 함. (인증키 신청)
- 다른 팀원 분의 코드 참조 (주석 따로 추가)
# gu_name은 인자로 받아옴. OPEN_API_KEY는 환경변수 파일에서 받아옴.
rainfall_URL = f'http://openapi.seoul.go.kr:8088/{OPEN_API_KEY}/json/ListRainfallService/1/100/{gu_name}'
# loads(): JSON 문자열을 Python 객체로 변환 / """ ~~ """ -> {}
# dumps(): Python 객체를 JSON 문자열로 변환 / {} -> """ ~~ """
# load(): JSON 파일을 Python 객체로 불러오기
# dump(): Python 객체를 JSON 파일에 저장하기
rainfall_response = json.loads(requests.get(rainfall_URL).content)
# 원하는 데이터를 주어진 딕셔너리에서 찾는다.
rainfall_data = rainfall_response['ListRainfallService']['row']
03. 환경변수 설정
- 환경변수: 운영체제(OS)에서 프로세스를 실행하기 위해 참조하는 변수
- (프로세스가 컴퓨터에서 작동할 때 영향을 미치는 글로벌 환경의 동적인 값들을 의미함)
- python-dotenv 적용하기: https://velog.io/@dldbwls492/python-dotenv
- 공식문서: https://github.com/motdotla/dotenv#should-i-have-multiple-env-files
- 그 밖의 Environ 사용하는 법: https://juniz.tistory.com/22
- (1) dotenv 설치: pip install python-dotenv
- (2) .env 파일 생성 후 환경변수 작성: touch .env / .env 파일은 root 위치에서 생성
- (3) .gitignore 파일에 .env 추가
- (4) settings.py에 import os, from dotenv import load_dotenv 추가
- (5) 예시: 'PASSWORD': os.environ.get('DB_PASSWORD')
- (6) python manage.py runserver로 실행 확인
- 다른 팀원 분의 코드 참조 (주석 따로 추가)
# settings.py
import os
from pathlib import Path
from dotenv import load_dotenv, find_dotenv
from django.core.exceptions import ImproperlyConfigured
# .env 파일의 경로를 찾아 가져오기
# Mac에서 종종 .env 파일 경로를 못 찾는 경우가 많아서 find_dotenv()를 경로로 설정.
# find_dotenv(): 디폴트 값으로 filename='.env'가 설정되어 있음
load_dotenv(find_dotenv())
# 예외처리하는 방식
def get_env_variable(var_name):
# 환경변수를 가져오거나 예외를 반환함
try:
return os.environ[var_name]
except KeyError:
error_msg = f'Set the {var_name} environment variable'
raise ImproperlyConfigured(error_msg)
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
# Django 프로젝트 폴더 위치
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = get_env_variable('SECRET_KEY')
ALGORITHM = get_env_variable('ALGORITHM')
OPEN_API_SECRET_KEY = get_env_variable('OPEN_API_SECRET_KEY')
APPEND_SLASH = False
DEBUG = get_env_variable('DEBUG')
ALLOWED_HOSTS = (get_env_variable('ALLOWED_HOSTS'), )
'원티드 > 기업 과제' 카테고리의 다른 글
[원티드] 2주차 과제: 페이히어 / 가계부 내역 CRUD, 테스트 코드 (0) | 2022.07.13 |
---|
Comments