선발대

[원티드] 1주차 과제: (주)랩큐 / 테스트 코드 본문

원티드/기업 과제

[원티드] 1주차 과제: (주)랩큐 / 테스트 코드

신선한 스타트 2022. 7. 3. 14:29

과제 진행기간

 

  • 2022년 6월 28일(화) ~ 2022년 7월 1일(금)

 

목적

 

  • Open API 방식의 공공데이터를 수집, 가공해서 전달하는 REST API와 이를 요청하는 클라이언트 개발

 

사용하는 데이터

 

 

요구사항

 

  • 72시간 내에 제
  • 클라이언트, 서버는 원하는 언어, 프레임워크로 개발해도 괜찮음. (우리는 Python, DRF)
  • 결과는 JSON 형식으로 나오도록 함.
  • 소스에 docstring 넣기

 


 

공부한 내용

 

01. 테스트 코드 작성(tests.py)

 

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)에서 프로세스를 실행하기 위해 참조하는 변수
  • (프로세스가 컴퓨터에서 작동할 때 영향을 미치는 글로벌 환경의 동적인 값들을 의미함)

 

 

  • 다른 팀원 분의 코드 참조 (주석 따로 추가)
# 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'), )

 

 

Comments