-
Notifications
You must be signed in to change notification settings - Fork 89
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
3주차 테스트 작성하기 #100
Open
tmxhsk99
wants to merge
10
commits into
CodeSoom:tmxhsk99
Choose a base branch
from
tmxhsk99:task-test-apply
base: tmxhsk99
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
3주차 테스트 작성하기 #100
Changes from all commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
b8f5615
3주차 테스트 작성하기
tmxhsk99 4f661a9
test : TaskService 테스트 수정 및 추가
tmxhsk99 6da3a44
test : TaskControllerTest 수정
tmxhsk99 e1146dc
test : 피드백 반영
tmxhsk99 e468b67
test : TaskControllerWebTest 수정 삭제 테스트 추가
tmxhsk99 04673fd
test : @SpringBootTest 제거
tmxhsk99 a0c183d
test : 사용하지 않는 insertTask 제거
tmxhsk99 a645d9a
test : `@SpringBootTest` 제거
tmxhsk99 0586f34
test : 사용하지 않는 insertTask 제거
tmxhsk99 1c0cc3f
Merge remote-tracking branch 'origin/task-test-apply' into task-test-…
tmxhsk99 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
143 changes: 143 additions & 0 deletions
143
app/src/test/java/com/codesoom/assignment/application/TaskServiceTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
package com.codesoom.assignment.application; | ||
|
||
import com.codesoom.assignment.TaskNotFoundException; | ||
import com.codesoom.assignment.models.Task; | ||
import org.assertj.core.api.Assertions; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; | ||
import org.springframework.boot.test.context.SpringBootTest; | ||
import org.springframework.boot.test.mock.mockito.MockBean; | ||
|
||
import static org.assertj.core.api.Assertions.*; | ||
import static org.junit.jupiter.api.Assertions.*; | ||
import static org.mockito.BDDMockito.given; | ||
|
||
|
||
class TaskServiceTest { | ||
|
||
TaskService taskService; | ||
|
||
@BeforeEach | ||
void setUp() { | ||
taskService = new TaskService(); | ||
} | ||
@Test | ||
@DisplayName("getTasks는 할 일이 비어있으면 빈 리스트를 반환한다.") | ||
void getFirstTasksIsEmpty() { | ||
assertThat(taskService.getTasks()).hasSize(0); | ||
} | ||
|
||
@Test | ||
@DisplayName("기존에 할일이 2개 있는 경우 2개 조회 테스트") | ||
void getTasksSuccess() { | ||
// given | ||
Task task1 = new Task(); | ||
Task task2 = new Task(); | ||
|
||
taskService.createTask(task1); | ||
taskService.createTask(task2); | ||
|
||
// when & then | ||
assertThat(taskService.getTasks()).hasSize(2); | ||
} | ||
|
||
@Test | ||
@DisplayName("getTasks는 해당하는 할일이 존재하는 경우 상세 할일 내용을 반환한다") | ||
void getTaskSuccess() { | ||
// given | ||
Task task = new Task(); | ||
task.setTitle("task0"); | ||
taskService.createTask(task); | ||
|
||
// when & then | ||
assertThat(taskService.getTask(1L).getTitle()).isEqualTo("task0"); | ||
} | ||
|
||
@Test | ||
@DisplayName("getTasks는 할일 상세 조회시 할일이 없는 경우 TaskNotFound 예외를 반환한다") | ||
void getTaskFail() { | ||
// when & then | ||
assertThatThrownBy(() -> taskService.getTask(100L)).isInstanceOf(TaskNotFoundException.class); | ||
} | ||
|
||
@Test | ||
@DisplayName("할일을 생성후 할일이 생성되었는지 확인하는 테스트") | ||
void createTaskSuccess() { | ||
// given | ||
Task task = new Task(); | ||
task.setTitle("task0"); | ||
|
||
// when | ||
Task createdTask = taskService.createTask(task); | ||
|
||
// then | ||
assertThat(createdTask.getTitle()).isEqualTo("task0"); | ||
} | ||
|
||
@Test | ||
@DisplayName("할일을 수정후 수정된 할일이 반환되는지 확인하는 테스트") | ||
void updateTaskSuccess() { | ||
// given | ||
Task task = new Task(); | ||
task.setTitle("task0"); | ||
taskService.createTask(task); | ||
|
||
Task updateTask = new Task(); | ||
updateTask.setTitle("task1"); | ||
|
||
// when | ||
Task updatedTask = taskService.updateTask(1L, updateTask); | ||
|
||
// then | ||
assertThat(updatedTask.getTitle()).isEqualTo("task1"); | ||
} | ||
@Test | ||
@DisplayName("존재하지 않는 할일을 업데이트 할 경우 예외를 반환하는 테스트") | ||
void notExistTaskUpdateFail() { | ||
// given | ||
Task task = new Task(); | ||
task.setTitle("task0"); | ||
taskService.createTask(task); | ||
|
||
Task updateTask = new Task(); | ||
updateTask.setTitle("task1"); | ||
|
||
// when & then | ||
assertThatThrownBy(() -> taskService.updateTask(100L, updateTask)).isInstanceOf(TaskNotFoundException.class); | ||
} | ||
|
||
@Test | ||
@DisplayName("할일을 삭제 후 삭제 되었는지 확인하는 테스트") | ||
void deleteTaskSuccess() { | ||
// given | ||
Task task = new Task(); | ||
task.setTitle("task0"); | ||
taskService.createTask(task); | ||
|
||
int oldSize = taskService.getTasks().size(); | ||
|
||
// when | ||
taskService.deleteTask(1L); | ||
|
||
int newSize = taskService.getTasks().size(); | ||
|
||
// then | ||
assertThat(newSize - oldSize).isEqualTo(-1); | ||
} | ||
|
||
@Test | ||
@DisplayName("존재하지 않는 할일을 삭제 할 경우 예외를 반환하는 테스트") | ||
void isNotExistTaskDeleteFail() { | ||
// given | ||
Task task = new Task(); | ||
task.setTitle("task0"); | ||
taskService.createTask(task); | ||
|
||
// when & then | ||
assertThatThrownBy(() -> taskService.deleteTask(100L)).isInstanceOf(TaskNotFoundException.class); | ||
} | ||
|
||
} |
145 changes: 145 additions & 0 deletions
145
app/src/test/java/com/codesoom/assignment/controllers/TaskControllerTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
package com.codesoom.assignment.controllers; | ||
|
||
import com.codesoom.assignment.TaskNotFoundException; | ||
import com.codesoom.assignment.application.TaskService; | ||
import com.codesoom.assignment.models.Task; | ||
import org.assertj.core.api.Assertions; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||
|
||
import static org.assertj.core.api.Assertions.*; | ||
|
||
|
||
class TaskControllerTest { | ||
private TaskController taskController; | ||
|
||
@BeforeEach | ||
void setUp() { | ||
taskController = new TaskController(new TaskService()); | ||
} | ||
|
||
public Task createTask() { | ||
Task task = new Task(); | ||
task.setTitle("task"); | ||
return task; | ||
} | ||
|
||
@Test | ||
@DisplayName("최초 할일 생성 후 할일 리스트에 값이 늘어난지 테스트") | ||
void createTaskSuccessTest() { | ||
// given | ||
Task task = createTask(); | ||
int beforeSize = taskController.list().size(); | ||
// when | ||
taskController.create(task); | ||
|
||
// then | ||
assertThat( | ||
beforeSize).isEqualTo(taskController.list().size() - 1); | ||
|
||
} | ||
|
||
@Test | ||
@DisplayName("최초 호출시 할일 리스트가 비어있는지 테스트.") | ||
void isFirstTasksIsEmpty() { | ||
assertThat(taskController.list()).isEmpty(); | ||
} | ||
|
||
@Test | ||
@DisplayName("할일 복수 있는 경우 해당 개수에 맞게 나오는지 테스트.") | ||
void listSuccessTest() { | ||
// given | ||
Task task1 = createTask(); | ||
Task task2 = createTask(); | ||
|
||
// when | ||
taskController.create(task1); | ||
taskController.create(task2); | ||
|
||
// then | ||
assertThat(taskController.list()).hasSize(2); | ||
} | ||
|
||
|
||
@Test | ||
@DisplayName("할일을 1개를 등록 후 해당 할일 상세 조회 테스트") | ||
void getTaskSuccess() { | ||
// given | ||
Task task1 = createTask(); | ||
|
||
// when | ||
taskController.create(task1); | ||
|
||
// then | ||
assertThat(taskController.detail(1L).getTitle()).isEqualTo("task1"); | ||
|
||
} | ||
|
||
@Test | ||
@DisplayName("존재하지 않지 않는 할일 조회시 TaskNotFound 예외 발생 테스트") | ||
void getTaskFail() { | ||
assertThatThrownBy(() -> taskController.detail(100L)) | ||
.isInstanceOf(TaskNotFoundException.class); | ||
} | ||
|
||
@Test | ||
@DisplayName("할일 수정 후 해당 할일 값이 수정되었는지 테스트") | ||
void updateTaskTest() { | ||
// given | ||
Task task = taskController.create(createTask()); | ||
Task updateTask = new Task(); | ||
updateTask.setTitle("updated"); | ||
|
||
// when | ||
taskController.update(task.getId(), updateTask); | ||
|
||
// then | ||
assertThat(taskController.detail(task.getId()).getTitle()).isEqualTo("updated"); | ||
} | ||
|
||
@Test | ||
@DisplayName("존재하지 않는 할일을 수정할 경우 TaskNotFound 예외 발생 테스트") | ||
void updatedFailTest() { | ||
// given | ||
Task task = taskController.create(createTask()); | ||
Task updateTask = new Task(); | ||
updateTask.setTitle("updated"); | ||
taskController.update(task.getId(), updateTask); | ||
// when then | ||
assertThatThrownBy(() -> taskController.update(100L, updateTask)) | ||
.isInstanceOf(TaskNotFoundException.class); | ||
} | ||
|
||
@Test | ||
@DisplayName("1개 할일을 삭제 후 해당 리스트의 삭제후 리스트가 비어있는지 테스트") | ||
void deleteTaskSuccess() { | ||
// given | ||
Task task = taskController.create(createTask()); | ||
// when | ||
taskController.delete(task.getId()); | ||
// then | ||
assertThat(taskController.list()).isEmpty(); | ||
} | ||
|
||
@Test | ||
@DisplayName("2개 할일을 삭제 후 해당 리스트의 삭제후 리스트크기가 감소했는 지 테스트") | ||
void deleteTasksSuccess() { | ||
// given | ||
taskController.create(createTask()); | ||
Task task = taskController.create(createTask()); | ||
int beforeSize = taskController.list().size(); | ||
// when | ||
taskController.delete(task.getId()); | ||
// then | ||
assertThat(taskController.list().size()).isEqualTo(beforeSize - 1); | ||
} | ||
|
||
@Test | ||
@DisplayName("존재하지 않는 할일을 삭제할 경우 TaskNotFound 예외 발생 테스트") | ||
void deleteTaskFail() { | ||
assertThatThrownBy(() -> taskController.delete(1L)).isInstanceOf(TaskNotFoundException.class); | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
할 일을 만드는 것이 반복되고 있네요. 테스트를 위해서 필요한 데이터를 미리 만들어놓고 사용하는 것은 어떨까요?
테스트를 위한 데이터 모음을 fixture라고 하는데, 믿고 사용할 수 있는 데이터를 미리 만들어 놓거나 쉽게 만들 수 있는 것을 만들어놓고 테스트에서는 테스트를 위한 코드들만 보이도록해서 의도를 더 명확하게 할 수 있을거에요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요
질문이 있습니다, 그런 할일 만드는 중복을 없애면서 테스트코드를 작성하다가
구글엔지니어는 이렇게 일한다 책에 12.4 테스트공유: DRY가 아니라 DAMP! 단락을 보고
서술적으로 테스트를 작성하는 것에 대해 혹시 어떻게 생각하시나요?
요정도 간단한 비즈니스로직에서는 사실 그렇게 차이는 없을 것 같지만...
혹시 제가 fixture를 잘못 이해하고 있는것인지 헷갈리기도 합니다...(fixture DRY관점이랑 상관이 없다던가...)
아니면 이정도는 간단하니 fixture를 써도 상관이 없다던가...뭔가 상반되는 내용같아서 헷갈립니다...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"책에서는 중복을 무조건 제거하는 것이 좋지 않을 수 있다." 라고 이야기하면서 단순하고 명료하게만 만들어준다면 테스트에서의 다소의 중복은 괜찮다고 이야기하고 있네요.
이부분에 대해서는 저도 적극 동의합니다. 효율적으로 작성된 테스트보다는 이해하기 쉬운 테스트여야 하죠.
책에도 예를들긴 했지만 이런 경우를 생각해볼 수 있을 것 같습니다.
하지만 그냥 할 일을 찾을 수 없다고 에러를 던지는 것보다 언제 저걸 던지는지 보여주고 싶다면, 혹은 할 일이 존재하는 경우를 보여주고 싶다면
이런식으로 이전에 어떤 상황이었는지를 명시적으로 드러낼 수 있습니다. 여기서
SOME_PRODUCT
같이 테스트에서는 별로 중요하지 않은 데이터를 미리 만들어 놓고 사용하는 것을 fixture라고 합니다.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
말씀해 주신 대로 하면 어떤 행위를 했는지도 같은 블록에 있어서
이 테스트를 보는 다른 사람에게 알아볼 수 있을 것 같네요
fixture가 before에 전부 섞여 있는 게 불편해서 (코드를 왔다 갔다 해야 되고 뭐가 이 테스트에 쓰이는지 알기 힘든 )
뭔가 답답한 감이 있었는데 해결된 것 같습니다.
BDD 형식으로 fixture도 사용하면서 하면 괜찮을 것 같습니다
감사합니다