"솔리테어: 덱다웃"에 적용된 다양한 테스트 기법을 소개합니다. 이들 기법을 코드레벨에서 다루지 않고, 기본 아이디어와 제작된 플러그인의 적용에 대해서 다룹니다. 저희가 제작한 플러그인을 가지고 각자의 프로젝트에 적용하면 더 적은 버그, 빠른 개발 주기, 향상된 유저 경험을 기대할 수 있을 것입니다.
구체적으로 범용적인 디버깅용 정보확인을 위한 UnitySettings, 기능단위 테스트 및 조작을 위한 CLI 바인딩, 자주 사용하는 디버깅 기능을 GUI로 바인딩해주는 Window 스크립트, 그리고 복잡한 문제 확인을 위한 UnityLuaREPL을 소개합니다.
13. 경쟁력을 갖기 위해 잘 해야만 했던 것
많은 컨텐츠
적은 버그
좋은 반응성
리텐션 요소
바이럴
직관적인 UI
적은 용량
신적화
스트레스 없는 플레이
스트레스 없는 플레이
매력적인 아트
좋은 피드백
높은 생산성
빠져드는 스토리텔링
레벨디자인
도전과 보상
모네타이제이션
그라인딩(노가다)
13
14. 짧은 개발 기간, 적은 개발 인원
많은 컨텐츠
적은 버그
좋은 반응성
리텐션 요소
바이럴
직관적인 UI
적은 용량
신적화
스트레스 없는 플레이
스트레스 없는 플레이
매력적인 아트
좋은 피드백
높은 생산성
빠져드는 스토리텔링
레벨디자인
도전과 보상
모네타이제이션
그라인딩(노가다)
14
15. 일하는 방식을 최적화 해야한다
많은 컨텐츠
적은 버그
좋은 반응성
리텐션 요소
바이럴
직관적인 UI
적은 용량
신적화
스트레스 없는 플레이
스트레스 없는 플레이
매력적인 아트
좋은 피드백
높은 생산성
빠져드는 스토리텔링
레벨디자인
도전과 보상
모네타이제이션
그라인딩(노가다)
15
16. 높은 생산성? HOW?
• 혁신적인 워크플로우
• 잘 정의된 기획
• 빠른 컴파일 시간
• 올바른 라이브러리 선택
• 좋은 업무환경
• ……………
• 좋은 테스팅 기법
16
17. • 통계를 초기화해야하는데, 방법이 오직 재설치뿐이라면…?
• 업적을 구현하였는데, 테스트를 위해서 업적을 직접 깨야한다면…?
• 카드이미지를 새로 만들었는데, 풀빌드를 해야 볼 수 있다면…?
• 승리시 보상을 높였는데, 빌드를 다시 넣어줘야 한다면…?
• 아이템이 가챠에서 나오나, 직접 가챠를 돌려야 한다면…?
• 원하는 카드팩을 얻기 위해서, 플레이를 해야한다면…?
• “리뷰주세요” 팝업을 보기 위해서, 1시간을 플레이 해야한다면…?
• 친구초대 보상을 받기 위해서, 직접 초대를 다 해봐야 한다면…?
좋은 테스팅 기법은 높은 생산성의 열쇠다!
이런 식으로는 안 된다테스트를 잘 해보자
17
18. 다양한 테스팅 기법들
랜덤 터치
테스트
자동화 테스트
CI
빌드후 테스트
인테그레이션
테스트
End-to-End
테스트
스트레스
테스트
서버쪽에서는…
데이터 검증
유닛 테스트
리그레션
테스트
빌드전 테스트
유니티가
Global state에 의존
디버거
로깅
디버깅 버튼
런타임 테스트
우리가
항상 하는 것! 모바일에서 더 잘해보자!
18
19. 런타임 테스트를 더 잘해보자!
디버거
로깅
디버깅 버튼
런타임 테스트
우리가
항상 하는 것!
이를 위해 우리가 만든 것들,
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
19
37. 그래서 이런게 있으면 좋겠다는 건데…
• n배속 플레이
• 서버 설정
• 통계조작
• 돈 강제 세팅
37
• 그 외에도…
• 업적 달성
• 게임 강제 승리
• 게임 승리시 랜덤 연출 고정
• 인벤토리 초기화
• 일일보상 초기화
• 퍼즐갤러리 초기화
38. GUI 디버깅 메뉴는 어떨까요?
네, 안 보입니다.기능 많아지면, 더 안 보입니다.
38
39. GUI 디버깅 메뉴는 어떨까요?
또한, 인자가 필요한 테스팅 기능을 표현하기 어렵다.
예를 들어 “특정 업적을 강제 달성하고 싶어요!”
강제 달성을 위해서 해당 업적 키값이 필요한데,
이걸 GUI로 어떻게 표현할 수 있을까요…?
GUI로 복잡한 것을 표현하기 어렵습니다.모바일에서는 더더욱이요!
39
51. 런타임 테스트를 더 잘해보자!
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
51
52. 그런데 가면 갈수록 명령어 수가 늘어난다
만들다보니 명령어 수가 84개가 되었다…
52
53. CLI 명령어를 엄청 많이 만들어 주셨네요
• 그런데 저는 쓰는 것만 많이 써요.
• 예를 들어, n배속 플레이, 돈 넣기, 인벤토리 초기화, 업적 초기화요.
• CLI를 연결하고 명령어를 그때그때 치는건 솔직히 괴롭네요.
• 기억하기도 힘들구요!
자주 쓰는 명령어는 정해져 있다
53
적어도 Editor에서는 GUI가 낫겠다
59. 이외에도…
CLI 입력기
작은 기능들
• Timescale 조절
• 네트워크 끄기
• 인앱구매 통과
• 랜덤보너스
• 가챠 확률 보기
• 리뷰 팝업 보기
• URL 열기
• 버전 정보
게임 상태
• FSM 강제 전환
• 새로운 게임
• 게임 승리
• 세레모니 고정
계정
• 로그인/로그아웃
• 회원탈퇴
• 랜덤 로그인
• 원하는 계정으로
로그인
현재
카드 배치
언어 전환
통계 업적
59
62. 런타임 테스트를 더 잘해보자!
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
62
63. 좋네요!
이제 범용적인 정보들을 UnitySettings에서 확인하고,
우리 프로젝트만을 위한 기능조작을 UnityCLI로 하고,
자주 사용하는 기능들을 EditorWindow에서 조작할 수 있어요!
이제 우린 충분한 생산성이 나오나요?정말로, 이제 우린 행복한 건가요?
63
64. 음… 그런데 말입니다,
• 이 모든 테스트 도구들은,
• 유저가, 그러니까 개발팀이,
• 어떤 식으로 테스팅을 할 지 알 때만 쓸 수 있네요?
64
65. 음… 그런데 말입니다,
• 다시 말해서, 게임의 기능 별로,
• 테스팅용 기능을 각각 준비해야 하는거 잖아요?
• 예를 들어, Wallet (코인을 관리)하는 클래스가 있을 때,
• Wallet을 위한 CLI 명령어,
• Wallet을 위한 Window 스크립트
• 를 만들어 줘야 테스팅이 가능하군요?
65
66. 음… 그런데 말입니다,
• 그러니까 정리하면, 어려운 말로,
• 유즈케이스가 있을 때의 테스팅 기법이군요?
• 전혀 알 수 없는 버그가 나왔을 때는
• 사용할 수 없는 거구요…
66
67. 유즈 케이스가 없는 경우의
테스팅 기능이 부족하다.
그래서 우리가 만든 것,
Lua REPL
67
73. 플러그인화
• 원하는 스크립트를 타겟디바이스에서 실행한다
• https://github.com/devsisters/UnityLuaREPL
73
74. 예를 들어, 언제 어떻게 쓸 수 있을까요?
• 문제가 파악을 위해, GameObject 하나하나 정밀하게 보고 싶다.
• 기능을 확인할 수 있는 조건이 까다로울 때, 강제로 실행하고 싶다.
• 리소스 수정 없이 수치를 실시간으로 튜닝해보고 싶다.
• ThirdParty SDK의 API 파악을 위해, 다양하게 실험을 하고 싶다.
• UI를 폰에서 실시간으로 잡아보고 싶다.
• 문제가 있을 것 같은 특정 리소스의 내용을 보고 싶다.
74
84. 그리고…
함께 좋은 게임을 만드실
여러분을 기다립니다.
https://github.com/devsisters/UnityCLI
https://github.com/devsisters/UnitySettings
https://github.com/devsisters/UnityLuaREPL
https://youtu.be/X6TPbyVUmwo
https://youtu.be/ifH3lKKndWQ
http://www.devsisters.com/jobs/
84
Hinweis der Redaktion
그래서 나온 것이 솔리테어: 덱다웃입니다.
다양한 테마와 애니메이션
가로세로 지원, 친구코드, 컬렉션요소가 있는 솔리테어 입니다.
가로세로 지원, 친구코드, 컬렉션요소가 있는 솔리테어 입니다.
(사진) 폰에서 버그가 발생했어요!
(사진) 원인 파악을 위해서 USB 연결
(사진) 테스트 기기가 연결이 되지 않는다…
(사진) ADB LOGCAT으로 로그 확인
(사진) 원인 파악
iOS는 로그 확인이 더 복잡하다
사진 교체
(사진) 폰에서 버그가 발생했어요!
(사진) 원인 파악을 위해서 USB 연결
(사진) 테스트 기기가 연결이 되지 않는다…
(사진) ADB LOGCAT으로 로그 확인
(사진) 원인 파악
iOS는 로그 확인이 더 복잡하다
사진 교체
애니메이션 처리
디버깅 기능을 만들고, 또 만들고…
근데 의외로 프로젝트에 종속적이지 않다
Reporter에서 영감을 받아 만든 플러그인
누구나 이용할 수 있게
폰에서 바로 확인할 수 있게
확장가능하게
제스쳐인식을 통해서 팝업을 켠다
사진 교체
스크린샷 교체, 에러로그를 볼 수 있도록
기획자가 과연 쓸 수 있을까? TODO
기능추가될때마다 UI가 난잡해진다.
(이미지) 복잡한 인자를 받는다면 더욱 복잡
GUI 없이 CLI로 클라를 조작하자.
기획자가 과연 쓸 수 있을까? TODO
기능추가될때마다 UI가 난잡해진다.
(이미지) 복잡한 인자를 받는다면 더욱 복잡
GUI 없이 CLI로 클라를 조작하자.
기획자가 과연 쓸 수 있을까? TODO
기능추가될때마다 UI가 난잡해진다.
(이미지) 복잡한 인자를 받는다면 더욱 복잡
GUI 없이 CLI로 클라를 조작하자.