Dev/TDD 16

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - BDD와 테스트 피라미드 전략

BDD 살펴보기행위 주도 개발의 개념은 댄 노스가 2000년대 중반에 창안했다. BDD란 비즈니스 요구 사항과 목표를 소프트웨어의 동작과 기능으로 변환하는 개발 방법론을 말한다. BDD를 실천한다면 애플리케이션이 어떻게 동작하는지 구체적인 사례를 가지고 여러 팀간에 원활하게 소통할 수 있으며, 이해관계자 간의 협력을 장려함으로써 의미 있는 소프트웨어를 만들 수 있게 된다.  BDD의 이점과 과제 ✔️ 사용자 요구 충족 : 사용자는 구현에 신경을 덜 쓰고 애플리케이션의 기능에 더 집중할 수 있다.✔️ 명확성 제공 : 시나리오는 소프트웨어가 수행해야 하는 작업을 명확히 한다. 시나리오는 기술에 친숙한 사람과 기술에 친숙하지 못한 사람 모두 이해할 수 있는 간단한 언어로 기술한다. 시나리오는 분할하거나 다른 ..

Dev/TDD 2025.02.25

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - Junit5을 통한 TDD

TDD의 핵심 개념TDD란 요구 사항을 테스트로 뽑아 낸 다음, 테스트를 통과하는 프로그램을 개발하는 과정을 되도록 짧게 반복하는 프로그래밍 기법이다.TDD는 작동하는 클린 코드를 추구함으로써 단순한 설계를 유도하고 소프트웨어의 안정성을 제고한다. 따라서 TDD는 다음과 같은 개발 주기를 가진다. ✏️  테스트한다, 코드를 작성한다, 리팩터링한다, (반복한다) ... 리팩터링은 소스 코드의 외부 동작에는 영향을 주지 않고 내부 구조만을 개선하는 방식으로 소프트웨어를 수정하는 작업이다. 이때 외부 동작에 영향을 주지 않는다는 것을 증명하기 위해서 테스트를 사용할 수 있다. 장점분명한 목표를 가지고 코드를 짤 수 있을뿐더러, 애플리케이션이 해야 하는 일만 정확하게 개발할 수 있다.기존의 소스 코드에 버그가 ..

Dev/TDD 2025.02.23

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 데이터베이스 애플리케이션 테스트

개발환경IDE :  intelliJ FrameWork : springboot 3.4Launguage : java 17BuildTool : gradle TestTool : Junit5  데이터베이스 단위 테스트시 발생하는 임피던스 불일치 (Impedance Mismatch) 단위 테스트는 코드를 격리시켜 실행해야하고, 작성과 구동이 쉬워야하며, 실행속도가 빨라야한다.  그렇기 때문에 관계형 모델을 기반으로 작성된 데이터베이스와 애플리케이션을 연결할 때 차이가 발생하는데, 이를 임피던스 불일치라고 표현한다. 이러한 임피던스 불일치를 해소하기 위해 ORM, IBATIS를 사용한다. 이번 글에서는 ORM 을 사용할 것이다. 더보기더보기📝  ORM 관계형 데이터베이스의 데이터를 객체 지향 프로그래밍의 객체로 ..

Dev/TDD 2025.02.04

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - Junit5 확장 모델

Junit5 확장 모델 살펴보기Junit5 확장 모델은 Extension API라는 단일 개념으로 설명할 수 있다. Extension자체는 내부에 필드나 메서드가 없는 인터페이스인 마커인터페이스일 뿐으로, 해당 인터페이스를 구현하는 클래스에 특별한 의미나 기능을 부여하기 위해 사용한다. 마커 인터페이스 (태그 인터페이스, 토큰 인터페이스)마커 인터페이스는 구현 메서드가 따로 없는 인터페이스로, 해당 인터페이스를 구현하는 클래스에 특별한 의미나 기능을 부여하기 위해 사용한다. 대표적인 사례로는 Serailizable과 Cloneable인터페이스가 있다.  public interface MyMarkerInterface { // No methods }  테스트가 생애 주기를 타는 중에 사전에 정의한 확장 지점..

Dev/TDD 2024.10.20

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - Gradle, IntelliJ 와 함께하는 Junit5

들어가기전에책에는 빌드 도구로 Gradle 뿐만 아니라 Maven,  IDE는 Eclipse 및 NetBeans 등이 추가로 기술되어 있었지만 책이 집필된 시점과 현재를 비교했을 때 사용률이 월등히 다르기도하고 내가 Gradle, Intellij, Jenkins를 실무에서 쓰고 있기 때문에 나머지 내용은 스킵했다.  이번 장에선 Junit5의 사용법보다는, 각 build Tool 과 IDE를 쓰면 얻을 수 있는 장점정도를 간략하게 정리하려고 한다.  GradleGradle은 프로젝트 설정 파일을 Groovy(그루비:JVM에서 실행될 수 있고 자바 언어와 호환 가능한 객체 지향 프로그래밍 언어)를 기반으로한 DSL로 작성한다. 여기서 DSL이란 Domain Specific language의 준말이다. 번역..

Dev/TDD 2024.10.09

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 모의 객체로 테스트 하기 (Mock) (2/2)

개발환경IDE :  intelliJ FrameWork : springboot 3.xLaunguage : java 17TestTool : Junit5    예제 소스 링크 모의 객체 프레임워크 사용해 보기이전 게시글에서 모의 객체를 밑바닥부터 구현했다. 프레임워크를 사용하면 프로젝트에서 이렇게 모의 객체를 하나하나 새로 생성할 필요 없이 더 쉽게 만들 수 있다. 일반적으로 많이 사용하는 테스트를 위한 프레임워크는 EasyMock, JMock, Mockito 에 대해 간략히 정리하려고 한다.   EasyMockEasyMock은 모의 객체를 사용하기 위한 유용한 클래스를 제공하는 오픈 소스 프레임워크다. 이전 게시글에서 작성한 예제를 EasyMock 프레임워크를 사용해서 리팩터링 해보자. 책에서는 maven ..

Dev/TDD 2024.09.24

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 모의 객체로 테스트 하기 (Mock) (1/2)

간단한 스텁과 모의 객체  리뷰Stub은 특정 상황에서 "결과만" 중요할 때 사용 →  Stub은 메서드가 무엇을 반환하는지에만 집중Mock은 "행위"가 중요할 때 사용 → 특정 메서드가 호출되었는지, 호출 횟수는 몇 번인지 등을 검증할 때 사용스텁을 활용하면 소스코드를 웹 서버, 파일 시스템, 데이터베이스 등의 환경에서 격리하여 단위 테스트를 수행할 수 있다. 그러나 메서드 호출을 다른 클래스로부터 격리하는 것과 같은 세밀한 격리를 위한 테스트는 모의객체(Mock)을 활용하여 효과적으로 수행할 수 있다. 즉, 각 메서드별로 개별적인 단위 테스트를 만들어 개발하는 것이 가능해진다.   모의 객체란?메서드에 집중하는 테스트를 만들 수 있다 → 대상 메서드가 다른 객체를 호출해서 발생하는 부수 효과가 생길일..

Dev/TDD 2024.08.27

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 큰 단위의 테스트를 위한 스텁(Stub)

스텁(Stub)과 모의 객체(Mock)의 필요성애플리케이션을 개발하다 보면 몇몇 코드 혹은 클래스들은 필수불가결하게 다른 클래스 혹은 특정환경에 의존한다.  특정 런타임 환경에 의존하는 애플리케이션을 위한 단위 테스트를 작성하는 것은 매우 어렵다. 테스트는 안정적이어야 하며 반복적으로 수행하더라도 같은 결과가 나와야 하기 때문이다. 예를 들어, 작성중인 애플리케이션이 타사에서 제공하는 웹 서버에 HTTP통신을 해야 하는 경우, 개발 환경에서는 그런 서버 통신을 하는 것이 사실상 불가능하다. ( 이것은 생각보다 실무에서 빈번하게 발생하는 문제이기도 하다. 개발 환경에 필요한 필수적인 인프라 스트럭처가 구체화되지 않았는데 개발자는 기능 구현을 할 수 있어야 한다. 😳 ) 그러므로 실제 장비 지원 없이도 소..

Dev/TDD 2024.07.14

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 소프트웨어 테스트 원칙과 테스트 품질 ( 2/2 )

테스트 커버리지 측정하기 이상적으로는 테스트가 애플리케이션 코드의 100%를 커버하는 것이 좋다. 테스트 커버리지는 그 자체로 코드의 품질을 어느 정도 보증한다. 하지만 절대적이지는 않다. 높은 테스트커버리지가 테스트의 질을 완전히 보장하지는 않기 때문이다. 훌륭한 개발자는 테스트를 실행하여 얻어 낸 기계적인 백분율 수치 이상을 볼 수 있어야 한다.  테스트 커버리지란?테스트 커버리지를 계산하는 데 다양한 지표가 활용될 수 있다. 가장 기본적인 지표는 테스트 묶음을 실행하는 동안 호출되는 애플리케이션의 메서드나 코드 줄의 수를 가지고 나타낸 백분율이다. 혹은 테스트가 호출하는 메서드를 추적해서 집계할 수 있다.  메서드가 어떻게 구현되어 있는지 자세히 알고 있다면 단위 테스트를 작성할 수 있다. 테스트 ..

Dev/TDD 2024.07.01

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 소프트웨어 테스트 원칙과 테스트 품질 ( 1/2 )

단위테스트를 하는 이유단위 테스트의 핵심 목표는 애플리케이션이 예상대로 작동하는지 확인하고 사전에 버그를 찾아내는 것이다.단위 테스트가 가지는 장점은 다음과 같다. 장점 기능 테스트만 수행했을 때보다 테스트 커버리지를 높일 수 있다 → 기능 테스트로는 수행하기 어렵거나 불가능한 오류 조건에 대해서도 쉽게 테스트할 수 있다. 팀 생산성이 향상된다 → 다른 컴포넌트가 준비될 때까지 기다리지 않고도 질적으로 우수한 코드를 전달할 수 있다. 기능 테스트는 어느 정도 준비가 되어야 실행 가능한 것과 대비된다 소스를 리팩터링 하거나 변경할 때 개발자에게 확신을 준다 → 어디에 문제가 생기는지 쉽게 알 수 있고 애플리케이션을 일일이 디버깅하지 않아도 된다애플리케이션 기능 구현에 도움을 준다 → 단위 테스트가 너무 길..

Dev/TDD 2024.07.01