Skip to content

Commit 1e99a5a

Browse files
committed
단위 테스트 삭제해야하는 상황
1 parent 05b8897 commit 1e99a5a

File tree

2 files changed

+68
-35
lines changed
  • posts

2 files changed

+68
-35
lines changed

posts/구름_COMMIT_발표/README.md

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,45 +12,41 @@
1212

1313

1414
```java
15-
public class LogAnalyzerTests
16-
{
17-
public void Analyze_TooShortFileName_CallsWebService()
18-
{
19-
ManualMockService mockService = new ManualMockService ();
20-
LogAnalyzer log = new LogAnalyzer(mockService);
21-
string tooShortFileName="abc.ext";
22-
log.Analyze(tooShortFileName);
23-
Assert.AreEqual("Filename too short:abc.ext",
24-
mockService.LastError);
25-
}
26-
}
27-
public class ManualMockService:IWebService
28-
{
29-
public string LastError;
30-
31-
public void LogError(string message)
32-
{
33-
LastError = message;
34-
}
35-
}
15+
public class LogAnalyzerTests {
16+
public void Analyze_TooShortFileName_CallsWebService() {
17+
ManualMockService mockService = new ManualMockService();
18+
LogAnalyzer log = new LogAnalyzer(mockService);
19+
string tooShortFileName = "abc.ext";
20+
21+
log.Analyze(tooShortFileName);
22+
23+
Assert.AreEqual("Filename too short:abc.ext", mockService.LastError);
24+
}
25+
}
26+
27+
public class ManualMockService : IWebService {
28+
public string LastError;
29+
30+
public void LogError(string message) {
31+
LastError = message;
32+
}
33+
}
3634
```
3735

3836
```java
39-
public void Analyze_TooShortFileName_ErrorLoggedToService()
40-
{
41-
MockRepository mocks = new MockRepository();
42-
IWebService simulatedService =
43-
MockRespository.DynamicMock<IWebService>();
44-
45-
using(mocks.Record())
46-
{
47-
simulatedService.LogError("bad string");
48-
}
37+
public void Analyze_TooShortFileName_ErrorLoggedToService() {
38+
MockRepository mocks = new MockRepository();
39+
IWebService simulatedService = MockRepository.DynamicMock<IWebService>();
40+
41+
using (mocks.Record()) {
42+
simulatedService.LogError("bad string");
43+
}
44+
45+
LogAnalyzer log = new LogAnalyzer(simulatedService);
46+
string tooShortFileName = "abc.ext";
4947

50-
LogAnalyzer log = new LogAnalyzer(simulatedService);
51-
string tooShortFileName="abc.ext";
52-
log.Analyze(tooShortFileName);
48+
log.Analyze(tooShortFileName);
5349

54-
mocks.VerifyAll();
50+
mocks.VerifyAll();
5551
}
5652
```

posts/테스트코드를_수정_삭제_해야하는경우/README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,40 @@
1515
- 테스트 이름을 바꾸거나 리팩터링할 때
1616
- 중복 테스트를 제거할 경우
1717

18+
19+
20+
##
21+
22+
1. 제품(프로덕션) 코드가 변경되어 테스트 시나리오가 실패하거나 의미가 없어졌을 때
23+
• 코드 리팩토링으로 인해 구조가 크게 변경되거나, 클래스·메서드가 사라져 기존 테스트가 무의미해진 경우
24+
• 기능 변경(요구사항 수정)으로 인해 기존 테스트 시나리오가 더 이상 맞지 않는 경우
25+
26+
이처럼 테스트 자체가 “옛날 이야기”가 되어버리면, 해당 테스트는 수정 혹은 삭제가 필요한다.
27+
• 수정: 변경된 로직에 맞추어 테스트 시나리오를 새롭게 잡아야 한다.
28+
• 삭제: 기능 자체가 없어지거나 요구사항과 동떨어져서 완전히 무의미해졌다면 미련을 두지 않고 정리하는 편이 좋다.
29+
30+
2. 중복 테스트로 인해 유지보수 효율이 떨어질 때
31+
• 동일하거나 매우 흡사한 시나리오를 여러 테스트가 중복해서 다루고 있는 경우
32+
• 여러 레벨(Unit, Integration, E2E 등)에서 불필요하게 같은 로직을 과도하게 검증하는 경우
33+
34+
테스트 중복이 심해지면, 수정해야 할 때 여러 곳을 손봐야 하므로 유지보수성이 떨어진다.
35+
• 테스트 목적 구분: 단위 테스트, 통합 테스트, E2E 테스트 등 각 수준별로 무엇을 검증해야 하는지 명확히 구분합시다.
36+
• 중복 제거: 여러 테스트가 같은 목적을 갖고 있다면 하나로 통합하거나, 꼭 필요치 않다면 삭제하는 것이 좋다.
37+
38+
39+
3. 테스트가 지나치게 내부 구현에 의존적일 때
40+
• 테스트가 변수명, private 메서드 로직 등 사소한 구현 변경에도 실패하는 경우
41+
• Mock, Stub, Spy 등과 결합이 너무 강해서, 구현 세부사항이 조금만 달라져도 테스트를 대대적으로 고쳐야 하는 경우
42+
43+
테스트는 “구현”이 아니라 “동작(기능)”을 검증해야 한다.
44+
• 구현 변경이 잦을 수 있다는 점을 고려해, 테스트가 너무 내부 로직에 밀접하지 않도록 설계한다.
45+
• 코드 구조를 바꾸거나, 테스트 자체를 간소화/추상화하는 방향으로 리팩토링이 필요한다.
46+
• 문제 해결이 어렵다면, 차라리 테스트를 새로 작성해서 “의도”를 명확히 담는 편이 더 효율적일 수 있다.
47+
48+
4. 유지보수, 가독성이 극도로 떨어져 재작성하는 편이 나은 경우
49+
• 테스트 코드 자체가 스파게티처럼 꼬여, 이해가 어려운 상태인 경우
50+
• 함수명, 시나리오 명세 등 설명이 전혀 없어 “무엇을 테스트하는지” 알기 어려운 경우
51+
52+
테스트를 수정하는 것보다 아예 새로 작성하는 것이 더 효율적일 수 있다.
53+
• 다른 팀원들이나 신입 개발자도 한눈에 이해할 수 있는 테스트가 이상적입니다.
54+
• Naming, 주석, 시나리오 설명을 충분히 작성해주면 향후 유지보수에 큰 도움이 됩니다.

0 commit comments

Comments
 (0)