SlideShare a Scribd company logo
1 of 39
Download to read offline
인수테스트 주도 개발
( Acceptance Test
Driven Development )
오재훈 (주)넷스루 연구소장
( jaehoon@nethru.co.kr,
ojh420@gmail.com,
https://www.facebook.com/jaehoon.oh.503 )
테스팅 재정의하기
http://www.skylinetechnologies.com/Insights/Skyline-Blog/July-2013/Test-Planning-Part-1-Improving-Your-Test-Results
시스템이 요구사항 대로 동작하는지를 테스트하는
것은 테스팅인가?
테스팅 재정의하기
새로운 정의:
- 체킹 : 요구사항 대로 구현되었는지 검사하는 과정
- 테스팅 : 시스템이 요구사항 대로 동작한다고 가정했을 때,
기계적으로 검증할 수 없는 시스템의 동작 방식을
탐색하고 발견하고 배우는 과정
Checking
- 이미 가지고 있는 믿음이 있을 때, 그 믿음과 일치하는지 검사하는 과정
- 우리가 알고 있는 시스템의 동작방식을 확인하는 것
- 프로그램이 합의된 사양대로 동작하는지를 확인하는 데 초점을 둔다.
- 결과는 흑백중 하나다.
- 기계적인 검증이 가능하다.
Testing
- 시스템에 대해서 아직 모르는 것을 찾기 위한 활동
- 탐색, 발견, 배움의 과정이다.
- 시스템이 어떻게 동작하는지에 대해 충분히 배우는데 초점을 둔다.
- 결과는 예측할 수 없다.
- 시스템의 행동을 관찰하고, 가치 판단이 개입되기 때문에 기계적 검증이
불가능하다.
테스팅 재정의하기
테스터
프로그래머
요구사
항
명세서
명세
읽기
설계
구현
테스트
명세
읽기
테스
트
설계
테스트
수행
버그
수정
테스트
수행
버그
수정
테스트
수행
...
프로그래머와 테스터는 어떻게 협력하는가?
전통적인 개발 프로세스
전통적인 개발 프로세스
http://www.skylinetechnologies.com/Insights/Skyline-Blog/July-2013/Test-Planning-Part-1-Improving-Your-Test-Results
전통적인 개발 프로세스
1. 현재 개발중인 기능이 어느 정도 진척되었나요? ( 개발 진척도 판단 기준 )
2. 현재 개발중인 기능이 언제쯤 완성이 될까요? ( 개발 완료 판단 기준 )
3. 기능을 검증할 테스트 케이스를 언제 설계 하나요?
4. 개발자들이 테스트케이스를 알고 있나요?
5. 테스트 언제 실행 하나요?
6. 테스트를 누가 수행 하나요?
7. 발견된 버그에 대한 정보들을 어떻게 주고 받나요?
8. 코드 구현 - 테스트 수행 - 버그 전달에 걸리는 시간은 얼마나 되나요?
9. 버그수정후 테스트를 재수행했을 때 회귀결함이 얼마나 많이 발생하나요?
10. 프로그래머와 테스트는 어떻게 협력하나요?
11. 어떤 비용들이 발생하고 있나요?
12. ...
이 질문들에 답해보세요.
전통적인 개발 프로세스
요구사항 명세서
Communication Bandwidth
Communication Bandwidth
인수테스트 주도 개발
프로그래머
인수테스트 주도 개발 (ATDD)
사용자
스토리
스토리
1 구현
요구사항
이해하기
예제 도출하기
예제 정제하기
인수
테스
트
작성
테스터
인수
테스
트
작성
스토리
1
탐색적
테스팅
스토리
2 구현
스토리
2
탐색적
테스팅
프로
그래머
테스터
고객
사용자 스토리(User Story)
인수 조건(Acceptance Criteria)
인천공항 주차장 요금표
http://www.airport.kr/pa/ko/d/3/2/4/index.jsp
※ 단기주차장의경우 주말(금·토·일),법정 공휴일, 동·하계 성수기(7월1일~8월31일, 12월1일~익년1월31일) 기간에는 상기 성수기
요금을 적용
구 분
최초 방문 시 2회차
방문시
3회차 방문부터
(변경요금)비성수기 성수기
단기주차장 소형
(시간당 2,400원)
기본 30분 1,200원
추가 15분 600원
(시간당 2,800원)
기본 30분 1,400원
추가 15분 700원
(시간당 2,400원)
기본 30분 1,200원
추가 15분 600원
일 12,000원 일 14,000원 일 18,000원 일 24,000원
장기주차장
(주차타워
포함)
소형
(시간당 1,000원)
일 9,000원
대형
(30분당 1,200원)
일 12,000원
화물터미널
주차장
소형
최초 45분 무료
추가 15분 500원
일 10,000원
대형
최초 45분 무료
추가 15분 600원
일 12,000원
이 상태에서 프로그래머가 구현을 시작한다면 어떤
일이 생길까요?
요구사항을 다르게 이해할 수 있는 가능성이
있을까요?
인수테스트 주도 개발 (ATDD)
요구사항을 다르게 이해할 가능성들
고객이 2016년 3월 16일 0시 0분 0초에 주차장에 들어와서, 30분 59초에 주차장을
나갔다. 몇 분으로 계산해야 하는가? ( 초를 어떻게 처리해야 하는가? )
전날 23시 50분에 주차장에 들어와서, 다음날 0시 20분에 주차장을 나가면
주차요금은 얼마인가? (하루의 기준)
고객이 2016년 3월 17일(목) 23시에 주차장에 들어와서 성수기 요금을 받는 18일
(금요일) 오전 01 시에 주차장을 나갔다면 요금은 얼마인가? ( 성수기/비수기
혼합시 계산방법 )
고객이 2016년 3월 17일(목) 23시 59분에 주차장에 들어와서 성수기 요금을 받는
18일(금요일) 오전 00 시 1분에 주차장을 나갔다면 요금은 얼마인가? (
성수기/비수기 혼합시 계산방법 )
...
ATDD 개발 과정
예제로
명세하기
예제 정제하기
실행 가능한
명세 만들기
Growing Object Oriented Software Guided by Tests by Steve Freeman & Nat Pryce
예제로 명세하기
고객(혹은 대리인), 프로그래머, 테스터가
협력해서 명세를 작성한다.
추상적인 요구사항을 동일하게 이해하기
위해서 객관적이고 구체적인 예제를
이용한다.
프로
그래
머
테스
터
고객
명세 정제하기
예제가 과도하게 많이 작성된 경우
관련성이 적은 정보를 제거하고
개발과 테스트에 필요한 정보만을 남긴다.
명세 정제하기
도메인 용어가 있다면 도메인 용어를
이용하여 예제를 기술한다.
테스트 자동화 프레임워크
Fit
Concordian
RobotFramework
Cucumber
JBehave
FitNesse
Selenium
Easyb
Watir
Arbiter
Cucumber 를 이용한 Specification 작성
Feature: 기능을 간략히 서술
기능에 대한 상세 설명
Scenario: 시나리오의 제목
Given 시나리오를 테스트하기 전의 시스템 상태를 기술(사전조건)
When 시스템에 발생시켜야 하는 이벤트를 기술
Then 이벤트가 발생했을 때 시스템이 사후상태를 기술(사후조건)
실행 가능한 Specification 만들기
Scenario Outline: [비수기] 단기 주차장에 주차한 경우 주차 요금을 계산한다.
When 방문객이 비수기에 단기 주차장에 <duration>동안 주차한다.
Then 방문객은 주차요금으로 <cost>원을 지불해야 한다.
Examples:
| duration | cost |
| 1분 | 1200 |
| 30분 | 1200 |
| 31분 | 1800 |
| 45분 | 1800 |
| 1시간 | 2400 |
| 5시간 | 12000 |
| 5시간 1분 | 12000 |
| 1일 | 12000 |
| 1일 1분 | 13200 |
| 1일 31분 | 13800 |
| 2일 1분 | 25200 |
| 3일 1분 | 37200 |
Cucumber 명세 예제
Feature: 인천공항 주차장의 주차 요금을 계산한다.
여기에 사용자 스토리를 적어주세요...
Scenario Outline: [비수기] 단기 주차장에 주차한 경우 주차 요금을 계산한다.
When 나는 평일에 단기 주차장에 <duration>동안 주차한다.
Then 나는 주차요금으로 <cost>원을 지불해야 한다.
Examples:
| duration | cost |
| 1분 | 1200 |
| 30분 | 1200 |
| 31분 | 1800 |
| 45분 | 1800 |
| 1시간 | 2400 |
| 5시간 | 12000 |
| 5시간 1분 | 12000 |
| 1일 | 12000 |
| 1일 1분 | 13200 |
| 1일 31분 | 13800 |
| 2일 1분 | 25200 |
| 3일 1분 | 37200 |
Cucumber Test 코드 작성
package com.inchon.parking;
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
@RunWith(Cucumber.class)
public class ShortTermParkingLotTest {
}
Cucumber Step Definitions
public class ShortTermParkingLotStepDefinitions {
@When("^방문객이 평일에 단기 주차장에 (.+)동안 주차한다.$")
public void 방문객이_평일에_단기_주차장에_분동안_주차한다(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
@Then("^방문객은 주차요금으로 (d+)원을 지불해야 한다.$")
public void 방문객은_주차요금으로_원을_지불해야_한다(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
@When("^방문객이 주말에 단기 주차장에 (.+)동안 주차한다.$")
public void 방문객이_주말에_단기_주차장에_분동안_주차한다(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
...
}
Cucumber 테스트 자동화 아키텍처
Examples
Test Framework
Glue Code
Support Code
Application
Under Test
*.feature
Cucumber
Cucumber Test
Step Definitions
Support Code
Production
Code
Cucumber
Test
실행 화면
Cucumber
Test
실행 화면
테스트 시나리오 품질
도출된 테스트 시나리오는
1. 비지니스 규칙을 기술하고 있는가?
2. 테스트 시나리오의 의도가 잘 드러나는가?
3. 쉽게 이해할 수 있는가?
4. 유지보수 비용이 많이 들지 않는가?
테스트 시나리오 기술 수준
https://gojko.net/2010/04/13/how-to-implement-ui-testing-without-shooting-yourself-in-the-foot-2/
테스트 시나리오 기술 수준
시니라오 기술
수준
설명
Technical Activity
● 시스템을 구현한 기술을 기준으로 테스트 시나리오를 작성하는 방법
● 테스트 시나리오에 기술과 관련된 용어들이 나타난다.
● 구현과 관련된 기술이 바뀌거나 시스템을 사용하는 순서가 바뀌면 테스트
시나리오를 수정해야 한다.
작업 흐름
( Workflow )
● 사용자가 시스템을 사용하는 작업의 흐름을 기준으로 테스트 시나리오를
작성하는 방법
● 테스트 시나리오에서 기술과 관련된 용어들이 나타나지 않기 떄문에
기술이 바뀌어도 테스트 시나리오는 바뀌지 않는다.
● 작업 흐름이 바뀌는 경우에는 테스트 시나리오를 변경해야 한다.
비지니스 규칙
( Business Rule )
● 비즈니스 규칙이 명확히 드러나도록 테스트 시나리오를 작성하는 방법
● 구현과 관련된 기술이 바뀌어도 테스트 시나리오를 수정하지 않아도 된다.
● 작업 흐름이 바뀌어도 테스트 시나리오를 수정하지 않아도 된다.
Technical Activity 로 기술하기
1. 인천공항 주차 요금 계산기 페이지로 접속한다.
2. 도착 예정 날짜 입력창에 “2015-10-14” 로 입력한다.
3. 도착 예정 시각 입력창에 “10”시로 입력한다.
4. 도착 예정 분 입력창에 “0” 분으로 입력한다.
5. 출차 예정 날짜 입력창에 “2015-10-14” 로 입력한다.
6. 출차 예정 시각 입력창에 “10” 시로 입력한다.
7. 출차 예정 분 입력창에 “30” 분으로 입력한다.
8. 차종 선택 라디오버튼에서 차종을 “소형" 으로 선택한다.
9. 주차장 선택 라디오버튼에서 주차장을 “단기"로 선택한다.
10. “요금계산하기" 버튼을 클릭한다.
11. 주차 요금 계산 결과 텍스트를 읽어서 값이 1200원인지 확인한다.
작업흐름(Workflow) 로 기술하기
1. 인천 공항 주차 요금 계산 페이지에 접속한다.
2. 도착 예정 시각을 “2015-10-14 10:00” 으로 설정한다.
3. 출차 예정 시각을 “2015-10-14 10:30” 으로 설정한다.
4. 차종을 소형으로 선택한다.
5. 요금을 계산을 요청한다.
6. 계산 결과가 “1200” 원이어야 한다.
비지니스 규칙으로 기술하기
Scenario: 평일 단기 주차장의 소형차 주차 요금을 계산한다.
When 고객이 평일에 소형차를 단기 주차장에 1분간 주차한다.
Then 고객은 주차요금으로 1200원을 지불해야 한다.
ATDD 도입으로 인한 변화
항목 Waterfall ATDD
의사소통과 협력 요구사항을 다르게 해석할 수 있음
개발자-테스터간 소통량이 적음
개발 막바지에 협력
고객-프로그래머-테스터간의 공통의
이해
프로그래머-테스터간의 소통량이
많아짐
개발 과정에서 수시로 협력해야 함
테스트 설계 시점 구현 진행이 완료되기 전 요구사항 명세 공유시
테스트 설계 방법 QA 팀에서 독자적으로 작업 고객, QA, 프로그래머 공동 작업
테스트 시나리오 작성
시점
개발이 완료될 무렵 개발전
인수테스트 실행 시점 프로그래머가 구현 종료후 테스터가
실행
프로그래머가 구현시 수시로 실행
진척도 판단 기준 프로그래머의 직관(감?) 인수테스트 통과 비율
완료 판단 기준 프로그래머의 직관(감?) 인수테스트 통과 비율 100%
역할의 변화 프로그래머 :
- 구현만 담당
테스터 :
프로그래머 :
- 구현
- 체킹 : 스펙대로 구현되어
ATDD 도입으로 얻을 수 있는 것들
● 요구사항은 추상적이어서 경험과 생각의 차이로 다르게
해석할 수 있지만, 예제는 구체적이고 객관적이기
때문에 다르게 해석하기 어렵다.
● 구체적인 예제를 이용해서 고객-프로그래머-테스터가
요구사항을 동일하게 이해하게 된다.
● 프로그래머가 요구사항을 오해해서 발생하는 버그를
미연에 방지할 수 있다.
● 프로그래머-테스터간에 발생할 수 있는 갈등을 방지할
수 있다.
감사합니다.

More Related Content

What's hot

[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요
[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요
[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요Jo Hoon
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정Arawn Park
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansibleKhizer Naeem
 
Docker Architecture (v1.3)
Docker Architecture (v1.3)Docker Architecture (v1.3)
Docker Architecture (v1.3)rajdeep
 
Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!Animesh Singh
 
Unit Testing with Jest
Unit Testing with JestUnit Testing with Jest
Unit Testing with JestMaayan Glikser
 
Docker Security Overview
Docker Security OverviewDocker Security Overview
Docker Security OverviewSreenivas Makam
 
Building infrastructure as code using Terraform - DevOps Krakow
Building infrastructure as code using Terraform - DevOps KrakowBuilding infrastructure as code using Terraform - DevOps Krakow
Building infrastructure as code using Terraform - DevOps KrakowAnton Babenko
 
테스트자동화 성공전략
테스트자동화 성공전략테스트자동화 성공전략
테스트자동화 성공전략SangIn Choung
 
Ansible Introduction
Ansible Introduction Ansible Introduction
Ansible Introduction Robert Reiz
 
Accelerate Quality with Postman - Basics
Accelerate Quality with Postman - BasicsAccelerate Quality with Postman - Basics
Accelerate Quality with Postman - BasicsKnoldus Inc.
 
Introduction to Virtualization
Introduction to VirtualizationIntroduction to Virtualization
Introduction to VirtualizationRahul Hada
 
iptables 101- bottom-up
iptables 101- bottom-upiptables 101- bottom-up
iptables 101- bottom-upHungWei Chiu
 
Unit testing framework
Unit testing frameworkUnit testing framework
Unit testing frameworkIgor Vavrish
 
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3Takaya Saeki
 
Introduction to virtualization
Introduction to virtualizationIntroduction to virtualization
Introduction to virtualizationAhmad Hafeezi
 

What's hot (20)

Junit
JunitJunit
Junit
 
[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요
[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요
[네전따] 네트워크 엔지니어에게 쿠버네티스는 어떤 의미일까요
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansible
 
Docker Architecture (v1.3)
Docker Architecture (v1.3)Docker Architecture (v1.3)
Docker Architecture (v1.3)
 
Configuration Management in Ansible
Configuration Management in Ansible Configuration Management in Ansible
Configuration Management in Ansible
 
Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!
 
Unit Testing with Jest
Unit Testing with JestUnit Testing with Jest
Unit Testing with Jest
 
Docker Security Overview
Docker Security OverviewDocker Security Overview
Docker Security Overview
 
testng
testngtestng
testng
 
Building infrastructure as code using Terraform - DevOps Krakow
Building infrastructure as code using Terraform - DevOps KrakowBuilding infrastructure as code using Terraform - DevOps Krakow
Building infrastructure as code using Terraform - DevOps Krakow
 
테스트자동화 성공전략
테스트자동화 성공전략테스트자동화 성공전략
테스트자동화 성공전략
 
Ansible Introduction
Ansible Introduction Ansible Introduction
Ansible Introduction
 
Accelerate Quality with Postman - Basics
Accelerate Quality with Postman - BasicsAccelerate Quality with Postman - Basics
Accelerate Quality with Postman - Basics
 
JUnit 5
JUnit 5JUnit 5
JUnit 5
 
Introduction to Virtualization
Introduction to VirtualizationIntroduction to Virtualization
Introduction to Virtualization
 
iptables 101- bottom-up
iptables 101- bottom-upiptables 101- bottom-up
iptables 101- bottom-up
 
Unit testing framework
Unit testing frameworkUnit testing framework
Unit testing framework
 
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
 
Introduction to virtualization
Introduction to virtualizationIntroduction to virtualization
Introduction to virtualization
 

Viewers also liked

ATDD in Practice
ATDD in PracticeATDD in Practice
ATDD in PracticeSteven Mak
 
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발Jaehoon Oh
 
Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorialBingu Shim
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraftbbongcsu
 
Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]bbongcsu
 
애자일 마인드셋
애자일 마인드셋애자일 마인드셋
애자일 마인드셋Jaehoon Oh
 
Clean code
Clean codeClean code
Clean codebbongcsu
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental systemJaehoon Oh
 
Bnf seeg ws
Bnf seeg wsBnf seeg ws
Bnf seeg wsbbongcsu
 
Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가Jaehoon Oh
 

Viewers also liked (11)

ATDD in Practice
ATDD in PracticeATDD in Practice
ATDD in Practice
 
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
 
Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorial
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraft
 
Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]
 
애자일 마인드셋
애자일 마인드셋애자일 마인드셋
애자일 마인드셋
 
Clean code
Clean codeClean code
Clean code
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental system
 
Bnf seeg
Bnf seegBnf seeg
Bnf seeg
 
Bnf seeg ws
Bnf seeg wsBnf seeg ws
Bnf seeg ws
 
Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가
 

Similar to 인수테스트 주도 개발

모바일 앱(App) 개발 테스트 솔루션 v20160415
모바일 앱(App) 개발 테스트 솔루션 v20160415모바일 앱(App) 개발 테스트 솔루션 v20160415
모바일 앱(App) 개발 테스트 솔루션 v20160415SeungBeom Ha
 
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본Lee Sang-Ho
 
웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우IMQA
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 YoungSu Son
 
모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템
모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템
모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템SeungBeom Ha
 
mAppCheck 상품소개서
mAppCheck 상품소개서mAppCheck 상품소개서
mAppCheck 상품소개서준형 김
 
Odin_CCTV based population counting platform
Odin_CCTV based population counting platformOdin_CCTV based population counting platform
Odin_CCTV based population counting platformSangwook Park
 
AWS Innovate: Mobile App testing with AWS Device Farm- Kevin Kim
AWS Innovate: Mobile App testing with AWS Device Farm- Kevin KimAWS Innovate: Mobile App testing with AWS Device Farm- Kevin Kim
AWS Innovate: Mobile App testing with AWS Device Farm- Kevin KimAmazon Web Services Korea
 
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료Sonia Lee
 
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료 2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료 D.CAMP
 
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive [2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive Amazon Web Services Korea
 
주차관리 시스템 프로토타입 제안서
주차관리 시스템 프로토타입 제안서주차관리 시스템 프로토타입 제안서
주차관리 시스템 프로토타입 제안서우진 신
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례SangIn Choung
 
[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1
[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1
[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1Luke Sunghyun Kim
 
알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018
알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018
알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018Amazon Web Services Korea
 
[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템
[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템
[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템강 민우
 
RemoteCall 리모트콜 PC원격지원 제안서
RemoteCall 리모트콜 PC원격지원 제안서RemoteCall 리모트콜 PC원격지원 제안서
RemoteCall 리모트콜 PC원격지원 제안서RSUPPORT
 
[IMQA] performance consulting
[IMQA] performance consulting[IMQA] performance consulting
[IMQA] performance consultingIMQA
 
모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)Jongwon Kim
 

Similar to 인수테스트 주도 개발 (20)

모바일 앱(App) 개발 테스트 솔루션 v20160415
모바일 앱(App) 개발 테스트 솔루션 v20160415모바일 앱(App) 개발 테스트 솔루션 v20160415
모바일 앱(App) 개발 테스트 솔루션 v20160415
 
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 인터넷과 정보사회 과제물 제출본
 
웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템
모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템
모바일 앱(App) 개발 테스트 솔루션 - 인터링크시스템
 
mAppCheck 상품소개서
mAppCheck 상품소개서mAppCheck 상품소개서
mAppCheck 상품소개서
 
Odin_CCTV based population counting platform
Odin_CCTV based population counting platformOdin_CCTV based population counting platform
Odin_CCTV based population counting platform
 
AWS Innovate: Mobile App testing with AWS Device Farm- Kevin Kim
AWS Innovate: Mobile App testing with AWS Device Farm- Kevin KimAWS Innovate: Mobile App testing with AWS Device Farm- Kevin Kim
AWS Innovate: Mobile App testing with AWS Device Farm- Kevin Kim
 
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
 
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료 2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
2015년 7월의 D.PARTY_오토팩토리 박신영 이사 발표 자료
 
가상현실의 정의
가상현실의 정의가상현실의 정의
가상현실의 정의
 
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive [2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
 
주차관리 시스템 프로토타입 제안서
주차관리 시스템 프로토타입 제안서주차관리 시스템 프로토타입 제안서
주차관리 시스템 프로토타입 제안서
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례
 
[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1
[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1
[WeFocus] 아모레퍼시픽 기술연구소 기술가치평가_세미나_2_김성현_20160812_v1
 
알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018
알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018
알아두면 쓸데있는 잡학사전- AWS Tips편::허준, 김병수::AWS Summit Seoul 2018
 
[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템
[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템
[IGC 2016] 엔씨소프트 김종원 - 모바일 테스트 자동화 시스템
 
RemoteCall 리모트콜 PC원격지원 제안서
RemoteCall 리모트콜 PC원격지원 제안서RemoteCall 리모트콜 PC원격지원 제안서
RemoteCall 리모트콜 PC원격지원 제안서
 
[IMQA] performance consulting
[IMQA] performance consulting[IMQA] performance consulting
[IMQA] performance consulting
 
모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)
 

인수테스트 주도 개발

  • 1. 인수테스트 주도 개발 ( Acceptance Test Driven Development ) 오재훈 (주)넷스루 연구소장 ( jaehoon@nethru.co.kr, ojh420@gmail.com, https://www.facebook.com/jaehoon.oh.503 )
  • 3. 테스팅 재정의하기 새로운 정의: - 체킹 : 요구사항 대로 구현되었는지 검사하는 과정 - 테스팅 : 시스템이 요구사항 대로 동작한다고 가정했을 때, 기계적으로 검증할 수 없는 시스템의 동작 방식을 탐색하고 발견하고 배우는 과정
  • 4. Checking - 이미 가지고 있는 믿음이 있을 때, 그 믿음과 일치하는지 검사하는 과정 - 우리가 알고 있는 시스템의 동작방식을 확인하는 것 - 프로그램이 합의된 사양대로 동작하는지를 확인하는 데 초점을 둔다. - 결과는 흑백중 하나다. - 기계적인 검증이 가능하다. Testing - 시스템에 대해서 아직 모르는 것을 찾기 위한 활동 - 탐색, 발견, 배움의 과정이다. - 시스템이 어떻게 동작하는지에 대해 충분히 배우는데 초점을 둔다. - 결과는 예측할 수 없다. - 시스템의 행동을 관찰하고, 가치 판단이 개입되기 때문에 기계적 검증이 불가능하다. 테스팅 재정의하기
  • 7. 전통적인 개발 프로세스 1. 현재 개발중인 기능이 어느 정도 진척되었나요? ( 개발 진척도 판단 기준 ) 2. 현재 개발중인 기능이 언제쯤 완성이 될까요? ( 개발 완료 판단 기준 ) 3. 기능을 검증할 테스트 케이스를 언제 설계 하나요? 4. 개발자들이 테스트케이스를 알고 있나요? 5. 테스트 언제 실행 하나요? 6. 테스트를 누가 수행 하나요? 7. 발견된 버그에 대한 정보들을 어떻게 주고 받나요? 8. 코드 구현 - 테스트 수행 - 버그 전달에 걸리는 시간은 얼마나 되나요? 9. 버그수정후 테스트를 재수행했을 때 회귀결함이 얼마나 많이 발생하나요? 10. 프로그래머와 테스트는 어떻게 협력하나요? 11. 어떤 비용들이 발생하고 있나요? 12. ... 이 질문들에 답해보세요.
  • 12. 프로그래머 인수테스트 주도 개발 (ATDD) 사용자 스토리 스토리 1 구현 요구사항 이해하기 예제 도출하기 예제 정제하기 인수 테스 트 작성 테스터 인수 테스 트 작성 스토리 1 탐색적 테스팅 스토리 2 구현 스토리 2 탐색적 테스팅 프로 그래머 테스터 고객
  • 15. 인천공항 주차장 요금표 http://www.airport.kr/pa/ko/d/3/2/4/index.jsp ※ 단기주차장의경우 주말(금·토·일),법정 공휴일, 동·하계 성수기(7월1일~8월31일, 12월1일~익년1월31일) 기간에는 상기 성수기 요금을 적용 구 분 최초 방문 시 2회차 방문시 3회차 방문부터 (변경요금)비성수기 성수기 단기주차장 소형 (시간당 2,400원) 기본 30분 1,200원 추가 15분 600원 (시간당 2,800원) 기본 30분 1,400원 추가 15분 700원 (시간당 2,400원) 기본 30분 1,200원 추가 15분 600원 일 12,000원 일 14,000원 일 18,000원 일 24,000원 장기주차장 (주차타워 포함) 소형 (시간당 1,000원) 일 9,000원 대형 (30분당 1,200원) 일 12,000원 화물터미널 주차장 소형 최초 45분 무료 추가 15분 500원 일 10,000원 대형 최초 45분 무료 추가 15분 600원 일 12,000원
  • 16. 이 상태에서 프로그래머가 구현을 시작한다면 어떤 일이 생길까요? 요구사항을 다르게 이해할 수 있는 가능성이 있을까요? 인수테스트 주도 개발 (ATDD)
  • 17. 요구사항을 다르게 이해할 가능성들 고객이 2016년 3월 16일 0시 0분 0초에 주차장에 들어와서, 30분 59초에 주차장을 나갔다. 몇 분으로 계산해야 하는가? ( 초를 어떻게 처리해야 하는가? ) 전날 23시 50분에 주차장에 들어와서, 다음날 0시 20분에 주차장을 나가면 주차요금은 얼마인가? (하루의 기준) 고객이 2016년 3월 17일(목) 23시에 주차장에 들어와서 성수기 요금을 받는 18일 (금요일) 오전 01 시에 주차장을 나갔다면 요금은 얼마인가? ( 성수기/비수기 혼합시 계산방법 ) 고객이 2016년 3월 17일(목) 23시 59분에 주차장에 들어와서 성수기 요금을 받는 18일(금요일) 오전 00 시 1분에 주차장을 나갔다면 요금은 얼마인가? ( 성수기/비수기 혼합시 계산방법 ) ...
  • 18. ATDD 개발 과정 예제로 명세하기 예제 정제하기 실행 가능한 명세 만들기 Growing Object Oriented Software Guided by Tests by Steve Freeman & Nat Pryce
  • 19. 예제로 명세하기 고객(혹은 대리인), 프로그래머, 테스터가 협력해서 명세를 작성한다. 추상적인 요구사항을 동일하게 이해하기 위해서 객관적이고 구체적인 예제를 이용한다. 프로 그래 머 테스 터 고객
  • 20. 명세 정제하기 예제가 과도하게 많이 작성된 경우 관련성이 적은 정보를 제거하고 개발과 테스트에 필요한 정보만을 남긴다.
  • 21. 명세 정제하기 도메인 용어가 있다면 도메인 용어를 이용하여 예제를 기술한다.
  • 23. Cucumber 를 이용한 Specification 작성 Feature: 기능을 간략히 서술 기능에 대한 상세 설명 Scenario: 시나리오의 제목 Given 시나리오를 테스트하기 전의 시스템 상태를 기술(사전조건) When 시스템에 발생시켜야 하는 이벤트를 기술 Then 이벤트가 발생했을 때 시스템이 사후상태를 기술(사후조건)
  • 24. 실행 가능한 Specification 만들기 Scenario Outline: [비수기] 단기 주차장에 주차한 경우 주차 요금을 계산한다. When 방문객이 비수기에 단기 주차장에 <duration>동안 주차한다. Then 방문객은 주차요금으로 <cost>원을 지불해야 한다. Examples: | duration | cost | | 1분 | 1200 | | 30분 | 1200 | | 31분 | 1800 | | 45분 | 1800 | | 1시간 | 2400 | | 5시간 | 12000 | | 5시간 1분 | 12000 | | 1일 | 12000 | | 1일 1분 | 13200 | | 1일 31분 | 13800 | | 2일 1분 | 25200 | | 3일 1분 | 37200 |
  • 25. Cucumber 명세 예제 Feature: 인천공항 주차장의 주차 요금을 계산한다. 여기에 사용자 스토리를 적어주세요... Scenario Outline: [비수기] 단기 주차장에 주차한 경우 주차 요금을 계산한다. When 나는 평일에 단기 주차장에 <duration>동안 주차한다. Then 나는 주차요금으로 <cost>원을 지불해야 한다. Examples: | duration | cost | | 1분 | 1200 | | 30분 | 1200 | | 31분 | 1800 | | 45분 | 1800 | | 1시간 | 2400 | | 5시간 | 12000 | | 5시간 1분 | 12000 | | 1일 | 12000 | | 1일 1분 | 13200 | | 1일 31분 | 13800 | | 2일 1분 | 25200 | | 3일 1분 | 37200 |
  • 26. Cucumber Test 코드 작성 package com.inchon.parking; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) public class ShortTermParkingLotTest { }
  • 27. Cucumber Step Definitions public class ShortTermParkingLotStepDefinitions { @When("^방문객이 평일에 단기 주차장에 (.+)동안 주차한다.$") public void 방문객이_평일에_단기_주차장에_분동안_주차한다(int arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } @Then("^방문객은 주차요금으로 (d+)원을 지불해야 한다.$") public void 방문객은_주차요금으로_원을_지불해야_한다(int arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } @When("^방문객이 주말에 단기 주차장에 (.+)동안 주차한다.$") public void 방문객이_주말에_단기_주차장에_분동안_주차한다(int arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } ... }
  • 28. Cucumber 테스트 자동화 아키텍처 Examples Test Framework Glue Code Support Code Application Under Test *.feature Cucumber Cucumber Test Step Definitions Support Code Production Code
  • 31. 테스트 시나리오 품질 도출된 테스트 시나리오는 1. 비지니스 규칙을 기술하고 있는가? 2. 테스트 시나리오의 의도가 잘 드러나는가? 3. 쉽게 이해할 수 있는가? 4. 유지보수 비용이 많이 들지 않는가?
  • 32. 테스트 시나리오 기술 수준 https://gojko.net/2010/04/13/how-to-implement-ui-testing-without-shooting-yourself-in-the-foot-2/
  • 33. 테스트 시나리오 기술 수준 시니라오 기술 수준 설명 Technical Activity ● 시스템을 구현한 기술을 기준으로 테스트 시나리오를 작성하는 방법 ● 테스트 시나리오에 기술과 관련된 용어들이 나타난다. ● 구현과 관련된 기술이 바뀌거나 시스템을 사용하는 순서가 바뀌면 테스트 시나리오를 수정해야 한다. 작업 흐름 ( Workflow ) ● 사용자가 시스템을 사용하는 작업의 흐름을 기준으로 테스트 시나리오를 작성하는 방법 ● 테스트 시나리오에서 기술과 관련된 용어들이 나타나지 않기 떄문에 기술이 바뀌어도 테스트 시나리오는 바뀌지 않는다. ● 작업 흐름이 바뀌는 경우에는 테스트 시나리오를 변경해야 한다. 비지니스 규칙 ( Business Rule ) ● 비즈니스 규칙이 명확히 드러나도록 테스트 시나리오를 작성하는 방법 ● 구현과 관련된 기술이 바뀌어도 테스트 시나리오를 수정하지 않아도 된다. ● 작업 흐름이 바뀌어도 테스트 시나리오를 수정하지 않아도 된다.
  • 34. Technical Activity 로 기술하기 1. 인천공항 주차 요금 계산기 페이지로 접속한다. 2. 도착 예정 날짜 입력창에 “2015-10-14” 로 입력한다. 3. 도착 예정 시각 입력창에 “10”시로 입력한다. 4. 도착 예정 분 입력창에 “0” 분으로 입력한다. 5. 출차 예정 날짜 입력창에 “2015-10-14” 로 입력한다. 6. 출차 예정 시각 입력창에 “10” 시로 입력한다. 7. 출차 예정 분 입력창에 “30” 분으로 입력한다. 8. 차종 선택 라디오버튼에서 차종을 “소형" 으로 선택한다. 9. 주차장 선택 라디오버튼에서 주차장을 “단기"로 선택한다. 10. “요금계산하기" 버튼을 클릭한다. 11. 주차 요금 계산 결과 텍스트를 읽어서 값이 1200원인지 확인한다.
  • 35. 작업흐름(Workflow) 로 기술하기 1. 인천 공항 주차 요금 계산 페이지에 접속한다. 2. 도착 예정 시각을 “2015-10-14 10:00” 으로 설정한다. 3. 출차 예정 시각을 “2015-10-14 10:30” 으로 설정한다. 4. 차종을 소형으로 선택한다. 5. 요금을 계산을 요청한다. 6. 계산 결과가 “1200” 원이어야 한다.
  • 36. 비지니스 규칙으로 기술하기 Scenario: 평일 단기 주차장의 소형차 주차 요금을 계산한다. When 고객이 평일에 소형차를 단기 주차장에 1분간 주차한다. Then 고객은 주차요금으로 1200원을 지불해야 한다.
  • 37. ATDD 도입으로 인한 변화 항목 Waterfall ATDD 의사소통과 협력 요구사항을 다르게 해석할 수 있음 개발자-테스터간 소통량이 적음 개발 막바지에 협력 고객-프로그래머-테스터간의 공통의 이해 프로그래머-테스터간의 소통량이 많아짐 개발 과정에서 수시로 협력해야 함 테스트 설계 시점 구현 진행이 완료되기 전 요구사항 명세 공유시 테스트 설계 방법 QA 팀에서 독자적으로 작업 고객, QA, 프로그래머 공동 작업 테스트 시나리오 작성 시점 개발이 완료될 무렵 개발전 인수테스트 실행 시점 프로그래머가 구현 종료후 테스터가 실행 프로그래머가 구현시 수시로 실행 진척도 판단 기준 프로그래머의 직관(감?) 인수테스트 통과 비율 완료 판단 기준 프로그래머의 직관(감?) 인수테스트 통과 비율 100% 역할의 변화 프로그래머 : - 구현만 담당 테스터 : 프로그래머 : - 구현 - 체킹 : 스펙대로 구현되어
  • 38. ATDD 도입으로 얻을 수 있는 것들 ● 요구사항은 추상적이어서 경험과 생각의 차이로 다르게 해석할 수 있지만, 예제는 구체적이고 객관적이기 때문에 다르게 해석하기 어렵다. ● 구체적인 예제를 이용해서 고객-프로그래머-테스터가 요구사항을 동일하게 이해하게 된다. ● 프로그래머가 요구사항을 오해해서 발생하는 버그를 미연에 방지할 수 있다. ● 프로그래머-테스터간에 발생할 수 있는 갈등을 방지할 수 있다.