Djanogo 알고리즘 구현 및 성능측정

Jingi·2024년 5월 3일

Web

목록 보기
35/40
post-thumbnail

테스트란?

  • 원하는 기능이 모두 구현되었는지 확인하고, 숨겨져있는 결함을 찾는 활동
  • 여러가지 도구들을 활용하여 버그를 찾아내고 신뢰성, 보안, 성능 등을 검증하는 중요한 단계

성능 테스트

  • 핵심 적인 테스트 중 하나
  • 특정 상황에서 시스템이 어느정도 수준을 보이는가 혹은 어떻게 대처를 하는가를 테스트하는 과정
  • 목적
    • 여러 테스트를 통해 성능 저하가 발생하는 요인을 발견하고 제거
    • 시장에 출시되기 전에 발생할 수 있는 위험과 개선사항을 파악
    • 안정적이고 신뢰할 수 있는 제품을 빠르게 만들기 위함

부하 테스트 (Load Testing)

  • 시스템에 임계점의 부하가 계속될 때 문제가 없는지
  • 목적 : 시스템의 신뢰도와 성능을 측정

스트레스 테스트 (Stress Testing)

  • 시스템에 과부하가 오면 어떻게 동작하는지?
  • 목적 : 장애 조치와 복구 절차가 효과적이고 효율적인 지 확인

부하 테스트 Vs. 스트레스 테스트

--부하 테스트(Load Testing)스트레스 테스트(Stress Testing)
도메인성능 테스트의 하위 집합성능 테스트의 하위 집합
테스트 목적전체 시스템의 성능 확인중단점에서의 동작, 복구 가능성 확인
테스트 방법임계점 까지의 가상 유저 수를 유지하며 모니터링중단점 이상까지 가상 유저를 점진적으로 증가
테스트 대상전체 시스템삭발된 트랜젝션에만 집중하여 테스트
테스트 완료 시기예상 부하가 모두 적용된 경우시스템 동작이 중단되었을 경우
결과부하 분산 문제
최대 성능
시간 당 서버 처리량 및 응답 시간
최대 동시 사용자 수 등
안정성
복구 가능성

API 성능 테스트

Locust Tool

  • 오픈 소스 부하 테스트 도구
  • 메뚜기 떼가 웹사이트를 공격한다는 의미
  • 내가 만든 서버에 수많은 사용자들이 동시에 들어올 때 어떤 일이 벌어 지는지 확인
  • Locust를 선택한 이유
    • 파이썬 언어로 테스트 시나리오를 간편하게 작성
    • 결과를 웹에서 확인할 수 있는 UI 지원

Locust 사용법

  1. 테스트 스크립트 작성하기

    • HttpUser : HTTP 요청을 만드는 가상 유저
    • wait_time : 작업 간 대기 시간
    • on_start() : 가상 유저 생성 시 실행
    • @task : 유저가 실행할 작업
    • @task(N) : 가중치 (실행 확률)
      • N만큼 높은 확률로 작업을 수행
    • self.client.get : HTTP GET 요청 전송
  2. Django 서버 실행

    cd performece_test
    python - m venv venv
    source venv/Scripts/activate
    
    (venv) pip install -r requirements.txt
    (venv) python manage.py makemigrations
    (venv) python manage.py migrate
    (venv) python manage.py runserver
    (venv) pip install locust
    (venv) locust -f ./locust_test.py
  3. Locust 실행시 아래의 주소 발생

  4. 웹 실행 화면

    • Number of users
      • 생성할 총 가상유저 수
    • Spawn rate
      • 동시에 접속하는 유저 수
    • Host
      • 서버 주소
  5. 웹 실행화면 - statistics 탭

    • 각 URL에 대한 요청수, 실패수, 각 기준에 대한 응답 시간, 평균 응답 크기, RPS 등 다양한 통계 내용을 확인할 수 있다.
    • 전체 분석은 터미널에서 터미널 종료 입력 또는 Download data 탭의 Download Report 클릭 시 확인할 수 있다.
  6. 웹 실행화면 - Charts 탭

    • 가로는 모두 시간을 의미합니다
    • Total Requests per Second
      • 초록선 : 초당 요청 수 (RPS)
      • 빨간선 : 초당 실패한 요청 수
    • Response Times(ms)
      • 각 응답에 대한 평균 응답 시간
      • 노란선 : (95%)
      • 초록선
        • 응답 시간의 중앙값
    • Number of Users
      • 동시에 요청을 보내는 유저 수
  7. 웹 실행 화면 Failures 탭

    • 실패한 요청에 대한 정보와 실패 원인을 출력한다.
  8. 웹 실행 화면 Current ratio 탭

    • 현재 작업이 수행된 비율을 출력

정렬 알고리즘 테스트

정렬 알고리즘 구현하기

  • 가상환경 설정

    • source venv/Scripts/activate
  • 테스트용 Django 프로젝트 및 앱 생성

    • (venv) django-admin startporject mypjt
    • (venv) python manage.py startapp test
  • Normal Sort, Bubble Sort, priority_queue

    from django.http import JsonResponse
    from rest_framework.decorators import api_view
    import random
    
    array_length = 1000
    random_range = 5000
    
    @api_view(['GET'])
    def bubble_sort(request):
        li = []
        for i in range(array_length):
            li.append(random.choice(range(1, random_range)))
        for i in range(len(li) - 1, 0, -1):
            for j in range(i):
                if li[j] < li[j + 1]:
                    li[j], li[j + 1] = li[j + 1], li[j]
        context = {
        'top': li[0]
        }
        return JsonResponse(context)
    
    @api_view(['GET'])
    def normal_sort(request):
        li = []
        for i in range(array_length):
            li.append(random.choice(range(1, random_range)))
        li.sort(reverse=True)
        context = {
            'top': li[0]
        }
        return JsonResponse(context)
    
    from queue import PriorityQueue
    
    @api_view(['GET'])
    def priority_queue(request):
        pq = PriorityQueue()
        for i in range(array_length):
            pq.put(-random.choice(range(1, random_range)))
        context = {
            'top': -pq.get()
        }
        return JsonResponse(context)
    
  • locust_test.py

    from locust import HttpUser, task, between
    
    class SampleUser(HttpUser):
        wait_time = between(1, 3)
    
        def on_start(self):
            print('test start')
    
        @task
        def normal_sort(self):
            self.client.get("test/normal_sort/")
    
        @task
        def priority_queue(self):
            self.client.get("test/priority_queue/")
    
        @task
        def bubble_sort(self):
            self.client.get("test/bubble_sort/")
    
profile
데이터 분석에서 백엔드까지...

0개의 댓글