Skip to content
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

2023.9.12 학습 기록 (테스트 가능한 구조) #18

Open
ChanJun-Park opened this issue Sep 11, 2023 · 0 comments
Open

2023.9.12 학습 기록 (테스트 가능한 구조) #18

ChanJun-Park opened this issue Sep 11, 2023 · 0 comments

Comments

@ChanJun-Park
Copy link
Owner

코드를 테스트 가능하게 만드는것은 무엇인가?

테스트가 어려운 이유는 테스트 코드 작성 방법 자체가 어렵기도 하지만, 테스트가 가능한 코드 구조를 작성하는게 어렵다는게 더 크다. 그럼 어떤 구조가 테스트를 가능하게 하는 것인가?

High Cohesion, Low Coupling

일단 테스트가 가능한 코드들은 높은 응집력과 낮은 결합력을 가지고 있다.

높은 응집력이란 하나의 기능을 수행하는 코드들이 모듈이나 클래스에 얼마나 잘 모여있는가를 의미한다. 한가지 기능이 모듈이나 클래스에 모여있기 때문에 이들을 유닛으로 테스트하기 쉬워진다.

낮은 결합력이란 하나의 모듈이나 클래스가 다른 모듈이나 클래스들과 최소한으로 상호작용하는 것을 의미한다. 결합력이 높아지면, 다시 말해서 모듈이나 클래스가 다른 모듈 또는 클래스와 상호작용이 많아지는 경우 유닛 테스트를 방해하는 요소들이 많아지게 되고, 테스트 작성을 어렵게 한다.

Abstracted code

위에서 낮은 결합력이 좋다고 했지만 항상 coupling 을 0으로 만들수는 없다. 다른 클래스를 아예 참조하지 않고 기능을 구현하는것이 어렵기 때문이다. 그러면 어떻게 다른 클래스를 사용하면서 테스트 용이한 구조로 만들 수 있는가?

이럴때는 의존하는 클래스를 추상 클래스나 인터페이스로 바꾸고, 실제 기능 동작에서는 실제 구현체를, 테스트 코드 실행시에는 테스트 더블을 전달하여 테스트 가능한 구조로 바꿀 수 있다.

Dependency Injection

클래스가 의존하는 다른 클래스를 abstracted code 로 바꿨다고 해도, 이를 사용할때 클래스 내부에서 직접 생성자를 호출하여 인스턴스화한 뒤 사용한다면, 테스트 시에 테스트 더블로 변경해서 전달할 수가 없다. 따라서 Dependency Injection 이 가능하도록 생성자 파라미터나, 필드 인젝션이 가능한 구조로 바꿔서 최종적으로 테스트 가능한 구조를 만들어야 한다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant