don't stop believing

Locust 설치와 기본 확인 본문

Testing Automation/Locust

Locust 설치와 기본 확인

Tongchun 2017. 12. 5. 19:11

API load Test Tool인 Locust를 설치해 봅시다.

[https://www.locust.io/]


python이 설치되어 있어야 하며 pip으로 locust를 설치할 수 있습니다. Lucust는 Python 2.7과 3.3, 3.4, 3.5, 3.6을 지원합니다.

$ pip3 install locustio

기본적으로 버전은 확인하고 가야겠죠?

$ locust --version
[2017-12-05 18:05:56,115] TongChunui-MacBook-Pro.local/INFO/stdout: Locust 0.8.1
[2017-12-05 18:05:56,115] TongChunui-MacBook-Pro.local/INFO/stdout: 

Mac에 설치한다면 libev도 설치해 줍니다.

$ brew install libev

Locust는 실행하기 전 Python Code를 먼저 작성해야 합니다.

저는 예제 코드를 아래처럼 작성했습니다. 테스트에 사용된 API는 Korbit API입니다.

[https://apidocs.korbit.co.kr/]

from locust import HttpLocust, TaskSet, task
import json

class UserBehavior(TaskSet):
	token_type = ""
	access_token = ""

	def on_start(self):
		self.getToken()

	def getToken(self):
		CLIENT_ID = "**********************"
		CLIENT_SECRET = "***********************"
		EMAIL = "tongchun@gmail.com"
		PASSWORD = "***********"
		GRANT = "password"

		url = "/v1/oauth2/access_token?client_id=%s&client_secret=%s&username=%s&password=%s&grant_type=%s" % (CLIENT_ID, CLIENT_SECRET, EMAIL, PASSWORD, GRANT)
		response = self.client.post(url, name='getToken')
		# print('Response status code:', response.status_code)
		# print('Response content:', response.content)

		respJson = json.loads(response.content)
		self.token_type = respJson['token_type']
		self.access_token = respJson['access_token']

	@task(1)
	def getUserInfo(self):
		headerString = ('%s %s') % (self.token_type, self.access_token)
		url = "/v1/user/info"
		response = self.client.get(url, headers={"Authorization": headerString}, name='getUserInfo')
		# print('Response status code:', response.status_code)
		# print('Response content:', response.content)

	@task(2)
	def getTicket(self):
		currency_pair = "btc_krw"
		url = "/v1/ticker?currency_pair=%s" % currency_pair
		response = self.client.get(url, name='getTicket')
		# print('Response status code:', response.status_code)
		# print('Response content:', response.content)

	@task(2)
	def getDetailedTicket(self):
		currency_pair = "btc_krw"
		url = "/v1/ticker/detailed?currency_pair=%s" % currency_pair
		response = self.client.get(url, name='getDetailedTicket')
		# print('Response status code:', response.status_code)
		# print('Response content:', response.content)

	@task(5)
	def getConstants(self):
		url = "/v1/constants"
		response = self.client.get(url, name='getConstants')
		# print('Response status code:', response.status_code)
		# print('Response content:', response.content)


class WebsiteUser(HttpLocust):
	host = "https://api.korbit.co.kr"
	task_set = UserBehavior
	min_wait = 1000
	max_wait = 5000

locust 실행 시 python 파일명을 옵션으로 넘겨줍니다. 그리고 load test 대상의 host도 넘겨줍니다.

host는 python 파일안에 정의되어 있다면 생략해도 됩니다.

$ locust -f first-test-locust.py --host=https://api.korbit.co.kr
[2017-12-06 15:56:05,628] TongChunui-MacBook-Pro.local/INFO/locust.main: Starting web monitor at *:8089
[2017-12-06 15:56:05,628] TongChunui-MacBook-Pro.local/INFO/locust.main: Starting Locust 0.8.1

브라우저를 열고 http://127.0.0.1:8089를 호출합니다

가상 유저 수(Number of users to simulate)와 초당 실행 수(users spawned/second)를 입력하고 Start swarming을 클릭합니다.

그럼 Locust는 작성한 Python Code를 실행하며 결과를 기록합니다.

Locust를 실행시킨 터미널을에서 Control + c를 눌러 Locust를 종료하면 실행 결과와 request에 대반 분포를 확인할 수 있습니다.

더 많은 가상 유저를 만들어 내기 위해 master와 multiple slave의 분산 구조를 구성할 수 있습니다.

먼저 master 서버는 --master 옵션을 추가해서 실행합니다.

locust -f first-test-locust.py --master --host=https://api.korbit.co.kr

slave 서버는 아래와 같이 실행시킵니다.

locust -f first-test-locust.py --slave --master-host=http:192.168.0.33 --host=https://api.korbit.co.kr

만약 같은 machine에서 실행한다면 --master-host를 제거합니다. --slave 옵션을 주면 master-host의 기본 값은 127.0.0.1이 됩니다.

locust -f first-test-locust.py --slave --host=https://api.korbit.co.kr

slave가 붙으면 우측 상단에 Slave 수가 표시됩니다.

여기까지 Locust설치와 기본 사용이었습니다.


Comments