티스토리 뷰

반응형

안녕하세요. 도미닉입니다.

 

오늘은 TDD 를 이용해 vmgit 을 제작해보겠습니다.

 

가상으로 git 처럼 동작하는 프로그램을 Swift 로 작성해보려고 합니다.

 

TDD 는 처음에 요구사항을 작성한 뒤에 아래의 3단계를 반복하며 개발하는 기법입니다.

 

요구사항을 테스트로 작성 -> 테스트를 통과할 최소한의 소스 작성 -> 리펙토링

 

우선 요구사항을 도출합니다.

 

1. init <repository_name> : init 명령어 뒤에 저장소명을 명령어를 실행하면 <repository_name> 이름으로 저장소 공간을 생성합니다.

2. status local <repository_name> : local에 있는 <repository_name> 저장소 내부 파일 상태를 출력합니다. 만약 저장소 이름이 없으면 전체 저장소 목록을 출력합니다.

3. checkout <repository_name> : 해당 저장소를 선택한 것을 표시하기 위해서 프롬프트 뒤에 <repository_name> 저장소 이름을 붙여서 출력합니다. 만약 저장소 이름이 없으면 아무런 저장소를 선택하지 않은 상태로 초기 상태와 동일하게 표시한다.

 

 

간단하게 Git 구조체를 작성했습니다.

 

main.swift

 

1) 이제 요구사항 1번의 테스트를 작성해보겠습니다.

vmgitTest.swift

git 구조체 인스턴스를 생성하고 init document 라는 명령어를 실행합니다.

그리고 git repository 이름 목록에 document 가 존재하는지 확인합니다.

 

아직 command 메서드가 비어있으므로 테스트를 통과하지 못합니다!

 

2) 이제 테스트가 통과되도록 소스를 작성해보겠습니다.

 

main.swift

공백 전에 문자열이 init 이면 공백 이후의 문자열을 repositoryName 배열에 추가하도록 작성하였습니다.

 

vmgit.swift

테스트를 성공적으로 통과했습니다.

 

3) 이제 리펙토링을 해야합니다.

 

우선 init 공백 문자열이 들어와야되는데 뒤에 올 문자열에는 공백이 있으면 안됩니다. repository 이름은 띄어쓰기를 지원하지 않기 때문입니다.

 

init 띄어쓰기 repository 이름이고 repository 이름에 공백이 있다면 오류가 발생해야합니다.

 

그리고 사용자로부터 입력받는 구조체도 작성해야 합니다.

 

main.swift
Git.swift
InputView.swift

위와 같이 리펙토링 하였습니다.

 

vmgitTest.swift

테스트 코드도 리펙토링하였습니다.

 

2번째 요구사항으로 넘어가려다가 보니까 결과값을 출력해주는 부분을 빠뜨렸습니다.

 

git init add 으로 repository 를 만들면 created add repository 와 같은 결과를 출력해주어야합니다.

 

아래와 같이 리턴값을 주고 출력해주도록 수정하였습니다.

Git.swift
main.swift
vmgitTest.swift

정상적으로 테스트를 통과합니다.

 

이제 2번째 요구사항을 진행해보겠습니다.

 

status local <repository_name> : local에 있는 <repository_name> 저장소 내부 파일 상태를 출력합니다. 만약 저장소 이름이 없으면 전체 저장소 목록을 출력합니다.

 

1) 아래와 같이 테스트코드를 작성하였습니다.

 

아직 status 명령어를 정의하지 않았기 때문에 테스트는 당연히 실패합니다.

 

2) 최단 시간에 테스트를 통과할 소스를 작성해보겠습니다.

 

vmgitTest.swift

조금 오래 걸리긴 했지만 테스트를 통과했습니다.

 

Git.swift

위와 같이 command 명령어를 실행하는 메서드와 저장소 리스트를 리턴하는 메서드를 작성하였습니다.

 

이번에는 특별히 리펙토링 할 부분이 안보입니다. 요구사항 3으로 넘어가도록 하겠습니다.

 

요구사항 3은 아래와 같습니다.

 

checkout <repository_name> : 해당 저장소를 선택한 것을 표시하기 위해서 프롬프트 뒤에 <repository_name> 저장소 이름을 붙여서 출력합니다. 만약 저장소 이름이 없으면 아무런 저장소를 선택하지 않은 상태로 초기 상태와 동일하게 표시한다.

 

vmgitTest.swift

위와 같이 테스트를 작성하였습니다.

 

기본값이 비어있으므로 여러개의 테스트가 이미 통과합니다.

 

2) 소스를 작성해보겠습니다.

 

Git.swift

Git 구조체의 프로퍼티에 현재 repository 를 저장하도록 currentRepository 를 추가해주고 checkout 명령어를 수행할 메서드를 작성했습니다.

 

테스트를 통과했습니다.

3) 리펙토링합니다.

 

입력하는 부분에서 만약 있는 repository 로 체크아웃 했다면 / 앞에 repository 이름이 나와야하는데 그 부분을 작성하지 않았습니다.

 

그 부분을 작성해주었습니다!

main.swift
InputView.swift

부끄럽지만 테스트케이스에 빠뜨린 부분이 있었습니다. checkout 명령어가 들어오면 인자로 들어온 부분을 확인하는데 비어있을 때의 처리를 안해준 것입니다. checkout 만 입력하니 프로그램이 멈춰버렸습니다.  

 

vmgitTest.swift

60번째 줄에 checkout 만 들어왔을 때 currentRepository 가 제대로 비어지는지 테스트 케이스를 추가하고

 

해당 작업이 수행되도록 소스를 수정했습니다.

 

Git.swift

우선 뒤에 인자가 있는지 확인하도록 if 문을 수정해주었습니다.

 

vmgitTest.swift

 

정상적으로 동작하고 리펙토링도 완료되었습니다.

 

긴 글 읽어주셔서 감사합니다.

반응형

'IT > Swift' 카테고리의 다른 글

Swift Patterns and Pattern matching  (0) 2019.05.03
Swift Overriding and Overloading  (0) 2019.04.29
Swift Protocol and Polymorphism  (0) 2019.04.25
Swift Property  (0) 2019.04.17
Swift Structure  (0) 2019.04.17
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함