backend-tech-forge / benchmark

A enterprise level performance testing solution. Taking inspiration from nGrinder, this project aims to develop a Spring Boot application mirroring nGrinder's functionality as closely as feasible.
MIT License
4 stars 0 forks source link

RestAPIs spec #8

Closed ghkdqhrbals closed 7 months ago

ghkdqhrbals commented 8 months ago

Rest APIs

BM-Controller

Method URL Detail Param / Model / Return 권한 비고
POST /api/user 사용자 생성 - / UserAddDto / UserInfo
GET /api/user, /api/users/{user_id} 사용자 조회 - / - / UserInfo ADMIN / USER
PATCH /api/user 사용자 업데이트 - / UserUpdateDto / UserInfo ADMIN / USER
DELETE /api/user 회원탈퇴 - ADMIN / USER
DELETE /api/users/{user_id} 사용자 지정 삭제 - ADMIN
GET /api/users/{user_id} 사용자 조회 - / - / UserInfo ADMIN / USER
GET /api/users 사용자 리스트 조회 - / - / List UserInfo ADMIN
POST /api/group 그룹 생성 - / GroupAddDto / GroupInfo ADMIN / USER
GET /api/groups/{group_id} 그룹 정보 조회 - / - / GroupInfo / ADMIN / USER
PATCH /api/groups/{group_id} 그룹 정보 수정 - / GroupUpdateDto / GroupInfo ADMIN / USER
DELETE /api/groups/{group_id} 그룹 삭제 - ADMIN
POST /api/groups/{group_id}/users/{user_id} 사용자를 그룹에 할당 - ADMIN / USER
DELETE /api/groups/{group_id}/users/{user_id} 사용자를 그룹에서 제거 - ADMIN / USER
POST /api/groups/{group_id}/template 템플릿 생성 - / - / TemplateInfo ADMIN / USER
GET /api/groups/{group_id}/templates 템플릿 조회 - / - / List TemplateInfo ADMIN / USER
GET /api/groups/{group_id}/templates/{template_id} 템플릿 조회 - / - / TemplateInfo ADMIN / USER
PATCH /api/groups/{group_id}/templates/{template_id} 템플릿 수정 - / TemplateInfo ADMIN / USER
DELETE /api/groups/{group_id}/templates/{template_id} 템플릿 삭제 - ADMIN / USER
POST /api/groups/{group_id}/templates/{template_id}?action={action} 벤치마크 작업 action / TemplateInfo / TestResult ADMIN / USER
GET /api/agent agent 상태 - / - / AgentInfo ADMIN / USER

BM-Agent

Method URL Detail Param / Model / Return 권한 비고
POST /api/tempates/{template_id}?action={action} 벤치마크 시작/중지 action / TemplateInfo / TestResult(SSE)
GET /api/status 에이전트 상태 - / - / 미정

MODEL(DTO)

UserAddDto

{
  "id": "gyumin",
  "pw": "1234",
  "slack_webhook_url": "https://hooks.slack.com/services/...",
  "email": "gyumin@gmail.com",
  "email_notification": true,
  "slack_notification": true,
  "groups": [
    {
      "id": "group-a",
      "name": "group-a-names"
    },
    {
      "id": "group-b",
      "name": "group-b-names"
    }
  ]
}

UserInfo

{
  "id": "gyumin",
  "slack_webhook_url": "https://hooks.slack.com/services/...",
  "email": "gyumin@gmail.com",
  "email_notification": true,
  "slack_notification": true,
  "groups": [
    {
      "id": "group-a",
      "name": "group-a-names"
    },
    {
      "id": "group-b",
      "name": "group-b-names"
    }
  ]
}

UserUpdateDto

{
  "id": "gyumin",
  "group_id": [
    "group-a",
    "group-b"
  ],
  "slack_webhook_url": "https://hooks.slack.com/services/...",
  "email": "changed@gmail.com",
  "email_notification": false,
  "slack_notification": false
}

GroupInfo

{
  "id": "group-a",
  "name": "group-a-names",
  "users": [
    "gyumin",
    "user1",
    "user2"
  ]
}

GroupUpdateDto

{
  "id": "group-a",
  "name": "group-a-names",
  "users": [
    "gyumin",
    "user1",
    "user2"
  ]
}

GroupAddDto

{
  "name": "group-a-names"
}

GroupUpdateInfo

{
  "name": "group-a-updated-names"
}

TemplateInfo

{
  "id": "template-a",
  "name": "template-a-name",
  "description": "template-a-description",
  "url": "http://test.com:8080/api/board",
  "method": "POST",
  "headers": {
    "Content-Type": "application/json"
  },
  "body": {
    "board_title": "...",
    "board_content": "...",
    "user_id": "..."
  },
  "prepare": {
    "url": "http://example.com:8080/login",
    "method": "POST",
    "headers": {
      "Content-Type": "application/json"
    },
    "body": {
      "id": "...",
      "password": "..."
    }
  }
}

TestResult

{
  "test_id": 26,
  "started_at": "2024-02-27T21:30:21.618101+09:00",
  "finished_at": "2024-02-27T21:30:21.618101+09:00",
  "url": "http://example.com:8080/user",
  "method": "POST",
  "total_requests": 10000,
  "total_errors": 0,
  "total_success": 10000,
  "status_code_count": {
    "2xx": 9969,
    "3xx": 0,
    "4xx": 131,
    "5xx": 0
  },
  "total_users": 10,
  "total_duration": "13s",
  "mttfb_average": "28.188ms",
  "MTTFBPercentiles": {
    "p50": "13.386ms",
    "p75": "23.908ms",
    "p90": "49.640ms",
    "p95": "103.998ms",
    "p99": "224.680ms"
  },
  "tps_average": 588.80,
  "TPSPercentiles": {
    "p50": 312.23,
    "p75": 113.19,
    "p90": 54.70,
    "p95": 23.55,
    "p99": 17.43
  }
}

AgentInfo

{
  "status": "TESTING",
  "template_id": 26,
  "started_at": "2024-02-27T21:30:21.618101+09:00",
  "finished_at": ""
}

Action

Action Description
start 테스트 시작
stop 테스트 중단

STATUS

Status Description
READY agent 기본
TESTING_START 테스트 시작
TESTING 테스트 중
TESTING_FINISH 테스트 정상 완료
CANCELED 유저가 테스트를 중단
STOP_BY_ERROR 테스트 에러로 인한 중단
LeeJeongGi commented 8 months ago

기록님은 깃이 더 편하신가봐요!

작성해주신 스펙은 테스트 코드 통해서 얻어온 정보를 저장해둔걸까요?

ghkdqhrbals commented 8 months ago

git project 로 관리한다면, git issue 로 작성하는게 편하더라구요!

위의 스펙은 구현 전에 어떤 restAPI 들이 필요할 지 사전에 정의해본 스펙입니다. 테스트 코드는 이제 위의 스펙에 맞춰서 작성해야 될 것 같아요.