개요

설계

지금 상황은?

언제 어떻게 모킹할까?

다이어그램

소켓 목 다이어그램

구현

SocketInterface

SocketInterface는 타입 스크립트로 정의되는 타입이며, SocketService가 socket.io에서 사용하는 변수/함수의 집합입니다. 아래 동일한 함수/변수를 SocketMock 클래스에서 지원해야 합니다.

type SocketInterface = {
  connected: boolean;
  id: string;
  emit: <T extends SocketEvent>(event: T, data: SocketDataMap[T]['request']) => void;
  on: <T extends SocketEvent>(event: string,callback: (data: SocketDataMap[T]['response']) => void) => void;
  off: <T extends SocketEvent>(event: string,callback: (data: SocketDataMap[T]['response']) => void) => void;
  onAny: <T extends SocketEvent>(callback: (event: T, data: SocketDataMap[T]['response']) => void) => void;
  disconnect: () => void;
};

SocketMock

SocketMock은 SocketInterface의 변수/함수를 지원해야 합니다.

중요한 것은 emit, on, off입니다.

SocketMock 예시

SocketMockLoadTest는 SocketMock을 상속받고 시나리오를 정의합니다.

import { SocketMock } from "../SocketMock";

export default class SocketMockLoadTest extends SocketMock {
  constructor() {
    super();
    // 100명의 더미 플레이어를 생성
    this.createDummyPlayer(100);
    // 5초동안 채팅 및 움직임
    this.performenceTest([this.chatRandom(5, 1), this.moveRandom(5, 1)]);
  }
}

mock-map

mockMap에는 미리 약속된 pin과 SocketMock 클래스가 key-value로 존재합니다. 여기에 속한 pin으로 접속할시 그에 해당하는 SocketMock을 불러옵니다.

import SocketMockChat from './SocketMockChat';
import SocketMockLoadTest from './SocketMockLoadTest';
import SocketMockLoadTestOnlyMove from './SocketMockLoadTestOnlyMove';
import SocketMockLoadTestWithQuiz from './SocketMockLoadTestWithQuiz';
import SocketMockNextQuiz from './SocketMockNextQuiz';
import SocketMockStartEnd from './SocketMockStartEnd';
import SocketMockStartGame from './SocketMockStartGame';

const mockMap = {
  'test-chat': SocketMockChat, // 10명의 플레이어가 채팅을 침
  'test-start-game': SocketMockStartGame, // 게임을 시작합니다.
  'test-next-quiz': SocketMockNextQuiz, // 두개의 퀴즈를 빠르게 진행합니다.
  'test-load': SocketMockLoadTest, // 100명의 플레이어가 채팅과 움직임을 만듭니다.
  'test-load-with-quiz': SocketMockLoadTestWithQuiz, // 위와 같은 부하 상황에서 퀴즈를 진행합니다.
  'test-start-end': SocketMockStartEnd, // 퀴즈를 시작하고 종료합니다.
  'test-load-only-move': SocketMockLoadTestOnlyMove // 200명의 플레이어가 움직입니다.
} as const;

export default mockMap;

SocketMock의 유틸 함수

SocketMock은 게임 시나리오를 손쉽게 구현할 수 있도록 여러 유틸함수를 포함합니다.

현재까지 구현한 SocketMock(일부)

url은 언제든지 비활성화될 수 있습니다!

200명의 플레이어가 테스트하는 화면

200명의 플레이어가 테스트하는 화면

결론