Embedded C에서 TDD를 실천하기 위해 시도했던 경험과 방법을 기록해 보았습니다.
HW로부터 생기는 버그인지 SW로부터 생기는 버그인지 짐작조차 되지 않는 상황이 자주 발생한다면, TDD를 시작해보세요.
이 자료에서는 호스트 시스템(PC)에서 TDD를 실천하는 방법과 타깃 시스템(nRF51-DK)에서 TDD를 실천하는 방법을 기록하였습니다.
또한, nRF51-DK가 아닌 다른 보드를 가지고 있더라도 실천 가능합니다.
ktim610@gmail.com
Embedded C에서 TDD를 실천하기 위해 시도했던 경험과 방법을 기록해 보았습니다.
HW로부터 생기는 버그인지 SW로부터 생기는 버그인지 짐작조차 되지 않는 상황이 자주 발생한다면, TDD를 시작해보세요.
이 자료에서는 호스트 시스템(PC)에서 TDD를 실천하는 방법과 타깃 시스템(nRF51-DK)에서 TDD를 실천하는 방법을 기록하였습니다.
또한, nRF51-DK가 아닌 다른 보드를 가지고 있더라도 실천 가능합니다.
ktim610@gmail.com
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기Ahreum Kim
2018. 11. 03 'FEConf 2018' 발표자료입니다.
---
처음으로 프론트엔드 프로젝트에 (유닛)테스트코드를 작성해보며 느낀 경험을 공유합니다. 어떤 관점으로 접근 했는지부터, 테스트코드 작성을 하며 만난 고민과 해결책은 어떤 방식으로 풀어 냈는지 코드와 함께 다뤄보려 합니다. 저는 테스트 숙련자가 아니지만, 저와 비슷한 위치에서 테스트에 입문하시려는 분들께 어떻게 테스트에 입문하고 코드를 작성했는지에 대해서 구체적인 경험을 공유하는 것도 의미있을 거라 생각했습니다. 제가 드릴 얘기들이 정답이 아닐 수 있지만, 더 좋은 방향을 고민하면서 같이 생각해볼 수 있다면 좋겠습니다.
어느날 우연히 스위처 소방수로 참여해서 2달 동안 수행한 일들을 공유합니다. 그 첫번재 이야기 ‘기본을 지키자’ 입니다.
전체를 리드하면서 업무를 진행해본 첫 경험이기도 했고, 유저가 증가하며 서비스되고 있는 프로젝트를 A to Z로 혼자 감당해본 첫 경험이기도 했습니다.
새로운 서버를 설계하고 개발하면서, 레거시 안정화 및 이슈 응대를 모두 병행하는게 쉬운 일은 아니었지만, 핑계대지 않고 하나하나 기본을 다져 보았습니다!
아직 갈길이 멀었지만, 성장해가는 아이오(스위처)의 소프트웨어 이야기를 하나씩 하나씩 풀어보려 합니다 ;)
2. 목표
● TDD 느껴보기
○ 조금 더 현실에서 볼 만한 예제
○ 코딩 하는 과정을 지켜보면서 ‘아~’ 하는 느낌 얻기
● 사전 필요 지식
○ JUnit, Mock에 대한 기본 지식 필요
● TDD가 뭔지는 설명하지 않음
3. TDD
● Test Driven Development 테스트 주도 개발
○ 제품 코드 만들기 전에 테스트 먼저 작성하기
● 기본 흐름 (완료할 때 까지 반복)
● 테스트 작성 순서
○ 쉬운 것, 예외적인 것 → 어려운 것, 정상적인 것
실패 테스트
작성
테스트
성공시키기
코드
청소하기
4. 구현해 볼 것
● 웹 로그인 기능
Login
Controller
Login
Command
AuthService
Authentication
UserRepository
User
5. 라이브 1 - AuthService
● 인증 서비스
Login
Controller
Login
Command
AuthService
Authentication
UserRepository
User
6. 라이브 1 - AuthService
● TDD 순서
○ 테스트 클래스 만들기
○ 객체 생성하기 (쉬운)
○ ID 값이 비정상인 경우 (쉬운, 정상에서 벗어난)
○ PW 값이 비정상인 경우 (쉬운, 정상에서 벗어난)
○ User가 존재하지 않는 경우 (정상에서 벗어난)
○ ID에 해당하는 User가 존재하는데, PW가 일치하지
않는 경우 (정상에서 벗어난)
○ ID와 PW가 일치하는 경우 (정상)
■ 인증 정보를 리턴
7. 라이브2 - LoginController
● 웹 요청 처리
Login
Controller
Login
Command
AuthService
Authentication
UserRepository
User
8. 라이브 2 - LoginContrller
● LoginController
○ 비슷한 순서로 진행
■ 폼 요청 처리 (쉬움)
■ 폼 전송 시, LoginCommand 값 이상, 폼 뷰 리턴
(비정상)
■ 폼 전송 시, ID/PW 불일치, 폼 뷰 리턴 (비정상)
■ 폼 전송 시, ID/PW 일치, 성공 뷰 리턴 (정상)
● 쿠키 생성 확인
* 시간 관계상, 거의 만들어진 코드로 살펴 봄
9. 라이브 3 - Spring MVC 테스트
● 웹 관점에서 컨트롤러 테스트
○ 컨트롤러 설정이 올바른지 확인
○ 응답 결과(JSON/XML 등)과 올바른지 확인
● 브라우저/서버 NO! 테스트 코드 YES!
○ spring-mvc-test 사용
● 여기선 맛 보기만
○ 더 자세한 내용은 이어지는 세션에서!
10. 우릴 기다리는 더 많은 이야기...
● 스프링 통합 테스트
○ @RunWith(SpringJUnit4ClassRunner.class)
● 스프링 MVC 테스트
○ MockMVC: 바로 다음 세션!
● DB 통합 테스트
○ DB Unit
● 테스트 계층 구조
○ @RunWith(Enclosed.class)
11. 정리
● TDD 장점
○ 짧은 호흡
■ 흐름(컨텍스트)을 유지, 집중력 향상
■ 문제 찾기 용이
● 테스트 직전에 작성한 코드에서 문제 발생 가능성 높음
○ 점진적 코드 완성
■ 필요한 코드만 쓰도록 유도
○ 회귀(regression) 테스트 기반
■ 코드 수정에 대한 자신감, 과감한 리팩토링 가능
● Mock
○ 외부 시스템 없이 핵심 코드 작성 가능
○ 필요한 경우 임시 구현 사용
12. 참고자료
● TDD 관련 서적
○ 테스트 주도 개발 (켄트 벡 저)
○ 객체 지향 설계와 실천 (스티브 프리먼 저)
○ Test Driven (Lasse Koskela)
● 본 강의 자료
○ http://javacan.tistory.com/entry/TDD-Live-in-SpringCamp-2013
■ 본 발표 자료와 강의 영상 포함
● TDD 관련 비디오
○ 백명석님 TDD 강의 자료 (4회)
■ http://youtu.be/wmHV6L0e1sU (TDD 1)
■ http://youtu.be/c-Pv2ia05Ek (TDD 2)
■ http://youtu.be/fFwDMzML7hI (TDD 3)
■ http://youtu.be/X4JtF2BfA0U (TDD 4)
13. 광고
● 코드 리뷰 함께 해요!
○ 코드에 대한 리뷰를 받아보고 싶은데
■ 마땅한 선배 개발자가 없나요?
■ 주변이 다들 바쁜가요?
○ 자리를 만들어서 같이 리뷰해 보아요~
■ 준비물은 코드를 볼 수 있으면 됨 (노트북, IDE)
○ 연락주세요!
■ 이메일: madvirus@madvirus.net
■ 트위터: @madvirus
○ 그냥 개발 얘기도 합니다.