관리 메뉴

Leo's Garage

smtm #2 - TDD 예시 본문

Study/AutoTradingBot

smtm #2 - TDD 예시

LeoBehindK 2023. 1. 15. 10:57
728x90
반응형

지난 시간에 이어서 smtm 코드 내에 TDD 예시 코드를 분석해보겠다. 

https://github.com/msaltnet/smtm

 

GitHub - msaltnet/smtm: It's a game to get money

It's a game to get money. Contribute to msaltnet/smtm development by creating an account on GitHub.

github.com

자 지난 시간에 우리는 업비트에서 제공하는 REST API 예제를 살펴보았다.

자 그런데 여기서 REST API가 뭔지 모르는 분도 있을 테니 간단히 설명하겠다. 

REST API는 두 컴퓨터 시스템이 인터넷을 통해서 전달하는 정보를 안전하게 교환하기 위한 일종의 약속이자 Interface라고 생각하면 된다. 

자 그러면 테스트를 수행할 코드를 살펴보자

"""TDD 연습용 모듈"""

import json
import requests
import copy


class TddExercise:
    URL = "https://api.upbit.com/v1/candles/minutes/1"
    QUERY_STRING = {"market": "KRW-BTC"}

    def __init__(self):
        self.data = []
        self.to = None
        self.count = 100

    def set_period(self, to, count):
        self.to = to
        self.count = count

    def initialize_from_server(self):
        """Open Api를 사용해서 데이터를 가져와서 초기화한다"""
        query_string = {"market": "KRW-BTC", "to": self.to, "count": self.count}

        response = requests.get(self.URL, params=query_string)
        self.data = response.json()
        # print(self.data)
        # print(self.data[0])

해당 Class를 살펴보면, 생성자에서 기본적으로 to와 count값을 초기화한다.

여기서 앞서 살펴본 업비트의 REST API를 다시 살펴볼 필요가 있다. 

curl --request GET \
     --url 'https://api.upbit.com/v1/candles/minutes/1?market=KRW-BTC&count=50' \
     --header 'accept: application/json'

여기서 ? 뒤에 market이나 count를 parameter라고 한다.

이것은 유저가 서버에 특정 정보를 요청하려고 할 때, 좀 더 구체적으로 질문을 하도록 세부사항을 전달하는 것이라고 보면된다.

단 unit은 /minutes/1로 표기한다. 

이러한 옵션은 몇 가지가 있는데 여기서 우리가 살펴 볼 옵션들을 나열하겠다.

uint : 데이터의 간격(분) 1, 3, 5, 10

to : 데이터의 마지막 시간 2018-04-18ㅆ10:16:00

count : 데이터의 개수

market : 마켓 정보 KRW-BTC

이 예제에서는 unit과 market을 1과 KRW-BTC로 고정한다

 

다시 코드로 돌아와서 살펴 보면

set_period함수는 to와 count를 업데이트해주고, initialize_from_server 함수는 해당 parameter와 함께 REST API를 호출하고 그 결과를 받는다. 

자 그러면 이 코드에 대한 테스트 코드를 작성해보자

class TddExerciseTests(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_set_period_update_period_correctly(self):
        ex = TddExercise()
        # check default value
        self.assertEqual(ex.to, None)
        self.assertEqual(ex.count, 100)

        ex.set_period("2020-02-25T06:41:00Z", 10)

        self.assertEqual(ex.to, "2020-02-25T06:41:00Z")
        self.assertEqual(ex.count, 10)

    def test_initialize_from_server_update_data_correctly_example(self):
        ex = TddExercise()
        self.assertEqual(len(ex.data), 0)

        ex.initialize_from_server()
        self.assertEqual(len(ex.data), 100)

test_set_period_update_period_correctly 함수를 살펴보자.

TddExercise로 객체를 생성하고 객체의 각 맴버 변수들의 초기 값이 잘 들어왔는지 확인한다.

두번째로 set_period를 통해서 to와 count를 업데이트하고 실제 값들이 해당 값으로 업데이트 되었는지 확인한다.

 

test_initialize_from_server_update_data_correctly_example 함수를 살펴보면, 객체 생성 직후 데이터는 당연히 없으므로 0이 맞다. 

초기화 함수를 호출하고 나면 기본적으로 100개의 데이터를 얻어오게 되므로 데이터는 100이 되는지 확인하면 코드가 정상적으로 돌아가는지 알 수 있다. 

이런식으로 각 코드들의 요구사항에 맞게 테스트 코드를 짤 수 있다. 

 

이 리뷰는 아래 책을 바탕으로 작성되었습니다.

http://www.yes24.com/Product/Goods/107635612

 

암호화폐 자동매매 시스템 만들기 with 파이썬 - YES24

이 책은 암호화폐 자동거래 프로그램의 설계부터 개발 후 활용까지 모든 과정을 다루고 있다. 파이썬의 기본적인 문법부터 설명하고 있지만 대부분은 실제 코드를 개발하는 과정과 함께 파이썬

www.yes24.com

 

728x90
반응형

'Study > AutoTradingBot' 카테고리의 다른 글

smtm #3 - mock  (0) 2023.01.15
smtm #1 - TDD 맛보기  (0) 2023.01.06
Comments