진행해야 할 테스트 사항
1.1 테스트 사항
1.2 커스터 마이징 스킨 선택 로직
1.2.1 스킨 선택 창 이동 로직 확인(볼륨 키 이동 로직 체크) - 완료
1.2.1.1 next box 호출 시 return code 값이 1 증가하는지 확인 - 완료
1.2.1.2 previos box 호출시 return code 값이 1 감소하는지 확인 - 완료
1.2.1.3 마지막 메뉴 (returnCode가 5)일 때 nextBox 호출 시 0으로 wrapping 되는지 확인 - 완료
1.2.1.4 처음 메뉴(returnCode가 0)일 때 previousBox 호출 시 5으로 wrapping되는지 확인 -완료
1.3 커스터 마이징 로직
1.3.1 방향 키 에 따른 좌표 변동 확인 // 완료
1.3.2 색상 팔레트 선택 로직 테스트 // 완료
1.3.3 스페이스 바 키 입력시 선택한 색상 칠해지는지 확인 // 완료
1.3.4 del 키 입력시 선택한 색상 없는지 , grid 값이 지워졌는 지 확인 // 완료
1.3.5 파일 저장 (Enter 키) 입력 시 2차원 배열 파일 있는지 확인 // 완료
1.4 저장한 커스터 마이징 파일 확인
1.4.1 저장된 커스터 마이징 파일이 커스터 마이징 선택 화면 그려지는지 확인 // 완료
커스터마이징 스킨 선택 로직 테스트
1.2.1 스킨 선택 창 이동 로직 확인(볼륨 키 이동 로직 체크)
1.2.1.1 next box 호출 시 return code 값이 1 증가하는지 테스트
1.2.1.2 previos box 호출시 return code 값이 1 감소하는지 테스트
테스트 코드 로직 설명
invokePrivateMethod 메서드를 사용하여 selectCustomScreen의 nextBox메서드와 previous 메서드를 호출하여 값이 변하는지 테스트 한다.
private void invokePrivateMethod(Object object, String methodName) {
try {
Method method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
}
invokePrivateMethod 메서드는 주어진 객체에서 비공개(private) 메서드를 호출하는 유틸리티 메서드이다.
invokePrivateMethod 메서드를 사용하여 selectCustomScreen의 nextBox메서드와 previous 메서드를 호출하여 값이 변하는지 테스트 한다.
selectCustomScreen의 nextBox메서드와 previous 메서드
private void nextBox() {
if (this.returnCode == 5){
this.returnCode = 0;
}
else{
this.returnCode++;
}
}
private void previousBox() {
if (this.returnCode == 0){
this.returnCode = 5;
}
else{
this.returnCode--;
}
}
@Test
public void testNextBox() {
// 현재 returnCode가 2일 때 nextBox 호출 시 3으로 증가하는지 확인
// Given
selectCustomScreen.returnCode = 2;
// When
invokePrivateMethod(selectCustomScreen, "nextBox");
// Then
assertEquals(3, selectCustomScreen.returnCode);
}
증가 확인 테스트 코드
slectCustomScreen 객체의 returnCode를 임의의 값 2로 설정하고, invokePrivateMethod 메서드를 호출하여 nextBox 메서드를 실행해서 nextBox 메서드 실행 후, returnCode가 3으로 증가하는지 확인한다
@Test
public void testPreviousBox() {
// 현재 returnCode가 4일 때 previousBox 호출 시 3으로 감소하는지 확인
// Given
selectCustomScreen.returnCode = 4;
// When
invokePrivateMethod(selectCustomScreen, "previousBox");
// Then
assertEquals(3, selectCustomScreen.returnCode);
}
감소 확인 테스트 코드
slectCustomScreen 객체의 returnCode를 임의의 값 4로 설정하고, invokePrivateMethod 메서드를 호출하여 previousBox 메서드를 실행해서 메서드 실행 후, returnCode가 3으로 감소 하는지 확인한다.
1.2.1.3 마지막 메뉴 (returnCode가 5)일 때 nextBox 호출 시 0으로 wrapping 되는지 테스트
1.2.1.4 처음 메뉴(returnCode가 0)일 때 previousBox 호출 시 5으로 wrapping되는지 테스트
테스트 코드 로직 설명
@Test
public void testPreviousBoxWrapping() {
// 현재 returnCode가 0일 때 previousBox 호출 시 5으로 wrapping 되는지 확인
// Given
selectCustomScreen.returnCode = 0;
// When
invokePrivateMethod(selectCustomScreen, "previousBox");
// Then
assertEquals(5, selectCustomScreen.returnCode);
}
@Test
public void testNextBoxWrapping() {
// 현재 returnCode가 5일 때 nextBox 호출 시 0으로 wrapping 되는지 확인
// Given
selectCustomScreen.returnCode = 5;
// When
invokePrivateMethod(selectCustomScreen, "nextBox");
// Then
assertEquals(0, selectCustomScreen.returnCode);
}
위의 로직과 동일과 동일 하나 0 (첫 스킨 창) 일 때 방향키 위를 입력했을 때 5가 되는지, 5 (마지막 스킨 창)일 때 방향키 아래를 입력 했을 때 0 이되는지만 다르다.
1.3.1 방향 키 에 따른 좌표 변동 확인 상 하 좌 우 이동
테스트 코드 로직 설명
@Test
public void testMoveWithArrowKeys() { // 방향 키 에 따른 좌표 변동 확인 , 키를 누를 때 CustomizeScreen 클래스의 좌표가 예상대로 이동하는지를 확인
//Given
CustomizeScreen customizeScreen = new CustomizeScreen(800, 600, 60);
int initialX = customizeScreen.getXPosition();
int initialY = customizeScreen.getYPosition();
//when
// 방향 키 누르기
if (inputManager.isKeyDown(KeyEvent.VK_UP)) {
// then
int movedUpY = customizeScreen.getYPosition();
assertEquals((initialY - 1 + 10) % 10, movedUpY);
}
if (inputManager.isKeyDown(KeyEvent.VK_DOWN)) {
int movedDownY = customizeScreen.getYPosition();
assertEquals((initialY + 1) % 10, movedDownY);
}
if (inputManager.isKeyDown(KeyEvent.VK_RIGHT)) {
int movedRightX = customizeScreen.getXPosition();
assertEquals((initialX + 1) % 10, movedRightX);
}
if (inputManager.isKeyDown(KeyEvent.VK_LEFT)) {
int movedLeftX = customizeScreen.getXPosition();
assertEquals((initialX - 1 + 10) % 10, movedLeftX);
}
}
사용자가 각 방향 키를 눌렀을 때 CustomizeScreen 객체가 예상된 좌표로 올바르게 이동하는지 검증하는 테스트
각 방향 키에 대해 inputManager.isKeyDown 메서드를 사용하여 키를 누른 상태를 확인하고, 특정 방향 키를 누른 경우assertEquals를 사용하여 예상한 좌표 이동이 실제로 발생했는지를 검증한다. 이때 이동한 좌표는 초기 위치와 방향 키에 따라 계산한다.
1.3.2 색상 팔레트 선택 로직 테스트
- 숫자 키 입력 하단에 해당 숫자 팔레트 초록색 표시
테스트 코드 로직 설명
@Test
public void testSelectColorFromPalette() { // 1.3.2 색상 팔레트 선택 로직 테스트 //
CustomizeScreen customizeScreen = new CustomizeScreen(800, 600, 60);
if (inputManager.isKeyDown(KeyEvent.VK_2)) // 2번 키 입력 받을 시
assertEquals(1, customizeScreen.getSelectedColorIndex());
// (1번 색상의 인덱스 = 2번 색상 숫자 색) 와 비교
else if (inputManager.isKeyDown(KeyEvent.VK_5)) { // 5번 키 입력 받을 시
assertEquals(4, customizeScreen.getSelectedColorIndex());
// (4번 색상의 인덱스= 5번 색상 숫자 팔레트)와 비교
}
else if (inputManager.isKeyDown(KeyEvent.VK_X)) { // X 키 입력 받을 시
// 색상이 변경되지 않아야 함
assertEquals(4, customizeScreen.getSelectedColorIndex());
}
}
색상 팔레트에서 특정 키 입력에 대한 동작을 테스트
inputManager.isKeyDown 메서드를 사용하여 특정 키 입력에 대한 상태를 확인하고, assertEquals를 사용하여 예상한 결과와 실제 결과를 비교하여 테스트 한다.
숫자키 1~9 입력
ex)
키 '2' 입력: '2' 키가 눌렸을 때customizeScreen.getSelectedColorIndex()가 빨간색(인덱스 num1 )과 같은지 검증
키 '5' 입력: '5' 키가 눌렸을 때 customizeScreen.getSelectedColorIndex()가 파란색(인덱스 num 4)과 같은지 검증
그 외 키 입력:
ex)
'X' 키가 눌렸을 때 customizeScreen.getSelectedColorIndex()가 이전과 같이 4와 같은지 확인(= 색상 변동 없어야함 )
1.3.3 스페이스 바 키 입력시 선택한 색상 칠해지는지 테스트
private int getColorIndexAtPosition(CustomizeScreen customizeScreen, int x, int y) {
//현재 화면의 특정 위치 (x, y)에서의 색상 인덱스를 가져오는 함수
Color[][] filledColors = customizeScreen.filledColors;
return filledColors[x][y] != null ? findColorIndex(customizeScreen, filledColors[x][y]) : -1;
// 해당 위치의 색상을 가져와서 null이 아닌 경우 findColorIndex 메소드를 호출하여 색상 인덱스 반환
}
private int findColorIndex(CustomizeScreen customizeScreen, Color color) {
// 특정 색상의 인덱스를 찾아 반환
Color[] colors = customizeScreen.filledColors[customizeScreen.selectedColorIndex];
for (int i = 0; i < colors.length; i++) {
//입력으로 받은 color와 동일한 색상을 반복문으로 돌려서 찾으면 해당 색상의 인덱스를 반환
if (colors[i].equals(color)) {
return i;
}
}
return -1;
}
getColorIndexAtPosition 메서드 현재 화면의 특정 위치 (x, y)에서의 색상 인덱스를 가져오는 함수,해당 위치의 색상이 채워져 있으면 색상 인덱스를 반환하고, 그렇지 않으면 -1을 반환한다
findColorIndex 메서드 설명: 특정 색상의 인덱스를 찾아 반환하는 함수이다 찾은 색상의 인덱스를 반환하고, 찾지 못한 경우 -1을 반환한다.
@Test
public void testColoringWithSpaceBar() {
//스페이스바 시 현재 위치에 선택한 색상이 칠해지는지 확인하는 코드
//현재 선택된 색상의 인덱스를 가져와서, 이 값이 현재 위치의 색상 인덱스와 일치하는지를 테스트
CustomizeScreen customizeScreen = new CustomizeScreen(800, 600, 60);
if(inputManager.isKeyDown(KeyEvent.VK_SPACE)) {
int selectedColorIndex = customizeScreen.getSelectedColorIndex(); // 선택한 색상 정보
int currentColorIndex = getColorIndexAtPosition(customizeScreen, customizeScreen.getXPosition(), customizeScreen.getYPosition()); // 현재 색상 정보
assertEquals(selectedColorIndex, currentColorIndex);
}
}
testColoringWithSpaceBar: 이 테스트 코드는 사용자가 스페이스바를 눌렀을 때, 선택한 색상이 현재 위치에 적용되는지를 확인한다. 현재 선택된 색상의 인덱스와 현재 위치의 색상 인덱스가 일치하는지 검증한다.
inputManager.isKeyDown(KeyEvent.VK_SPACE)로 스페이스바 키 입력을 확인하고 (= 색칠됨), getSelectedColorIndex()로 현재 선택된 색상의 인덱스와 getColorIndexAition()용하여 현재 위치의 색상 인덱스를 가져와서 선택한 색상인덱스와 ,현재 좌표의 색칠된 색상인덱스가 일치하는지를 assertEquals로 테스트한다.
1.3.4 del 키 입력시 선택한 색상 지워졌는지 , grid 값이 지워졌는지 테스트
@Test
public void testDeleteKey() {
CustomizeScreen customizeScreen = new CustomizeScreen(800, 600, 60);
if (inputManager.isKeyDown(KeyEvent.VK_DELETE)) {
int xPosition = customizeScreen.getXPosition();
int yPosition = customizeScreen.getYPosition();
// DEL 키가 처리된 후, 해당 위치의 값이 null로 설정되었는지 확인
Color deletedColor = customizeScreen.getFilledColors()[xPosition][yPosition];
assertThat("Filled color should be null after pressing DELETE key", deletedColor, nullValue());
assertThat("Grid value should be false after pressing DELETE key",
customizeScreen.getGrid()[xPosition][yPosition], is(false));
}
}
테스트코드는 사용자가 Delete 키를 누를 때 CustomizeScreen 객체의 현재 위치의 색상값이 null로 설정되고, 해당 위치의 grid 값이 false로 설정되는지를 검증하는 메서드이다.
CustomizeScreen 객체의 filledColors 배열과 filledColor의 grid 배열을 가져와서 assertThat:(특정 조건을 검증하는 Hamcrest 라이브러리의 메서드) nullValue() 및 is(false)를 사용하여 Delete 키 입력 시 현재 위치의 색상값이 null로, 해당 위치의 grid 값이 false로 설정되었는지를 확인한다.
1.3.5 파일 저장 (Enter 키) 입력 시 2차원 배열 파일 있는지 테스트
테스트 코드 로직 설명
@Test
public void testSaveToFile() { // 파일 저장 (Enter 키) 입력 시 2차원 배열 파일 있는지 확인인
CustomizeScreen customizeScreen = new CustomizeScreen(800, 600, 60);
// Initial state
ArrayList<Map.Entry<boolean[][], Color>> initialSkinList = customizeScreen.getSkinList();
if (inputManager.isKeyDown(KeyEvent.VK_ENTER)) {
// Check if the skinList was updated
ArrayList<Map.Entry<boolean[][], Color>> updatedSkinList = customizeScreen.getSkinList();
assertNotEquals(initialSkinList, updatedSkinList);
}
}
CustomizeScreen 객체를 생성하고, Enter 키가 눌렸을 때 2차원 배열 파일이 업데이트되는지 확인하는 테스트를 수행, 이 테스트의 목적은 사용자가 Enter 키를 누를 때 CustomizeScreen 객체의 2차원 배열 파일이 업데이트되는지를 검증하는 것이다.
테스트는 초기 상태에서 getSkinList를 호출하여 초기 skinList를 가져온 후, Enter 키가 눌렸을 때 다시 getSkinList를 호출하여 업데이트된 skinList를 가져와 초기 skinList와 비교한다.
1.4.1 저장된 커스터 마이징 파일이 커스터 마이징 선택 화면 그려지는지 테스트
package engine;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import screen.CustomizeScreen;
import java.awt.*;
class DrawManagerTest {
@BeforeEach
void setUp() {
// DrawManager 초기화
DrawManager drawManager = new DrawManager();
// Frame 초기화
Frame frame = new Frame(800, 600, 60);
// CustomizeScreen을 테스트에 맞게 초기화
CustomizeScreen customizeScreen = new CustomizeScreen(800, 600, 60);
customizeScreen.setSelectedColorIndex(2);
// initDrawing 메서드 호출
drawManager.initDrawing(customizeScreen);
}
@Test
void testDrawCustomizing() {
// 가상의 CustomizeScreen 객체 생성
CustomizeScreen customizeScreen = new CustomizeScreen(800, 600, 60);
// 가상의 filledColors 배열 초기화 (예시로 일부 색상을 지정)
Color[][] filledColors = new Color[10][10];
filledColors[3][3] = Color.RED;
filledColors[4][4] = Color.GREEN;
// CustomizeScreen에 가상의 filledColors 배열 설정
customizeScreen.filledColors = filledColors;
// 가상의 Frame 객체 생성
Frame frame = new Frame(800, 600, 60);
// 가상의 DrawManager 객체 생성
DrawManager drawManager = new DrawManager();
// 테스트: drawCustomizing 메서드 호출 후 예상되는 결과를 확인
drawManager.drawCustomizing(customizeScreen, 0, 0, filledColors);
}
}
drawCustomizing 메서드가 예상대로 작동하는지 확인 하는 테스트 코드로, CustomizeScreen의 특정 위치에 색상이 정상적으로 그려지는 검증하는 코드이다. 테스트 코드의 예시로 지정된 위치에 빨간색과 초록색이 정상적으로 그려지는지 확인한다. 이를 통해 그림 그리기 관련 메서드들이 올바르게 동작하는지 테스트 한다.
'프로젝트 > SpaceInvaders' 카테고리의 다른 글
후속 개발 프로젝트 회고 (1) | 2023.12.16 |
---|---|
커스터마이징 테스팅 목록 및 개발 환경 설정 (With Junit, intelliJ) (1) | 2023.12.06 |
후속 개발 (커스터 마이징 기능 구현) (0) | 2023.11.29 |
커스터마이징 옵션 선택 로직 제작 (0) | 2023.11.22 |
후속 개발 (With Jira, Agile process, planning poker) (2) | 2023.11.21 |