ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
xUnit Test Pattern
15장. 코드 냄새
ë°•ìƒí˜ http://pixelmine.tistory.com
    아꿈사 http://andstudy.com
15장ì—서 다루는 냄새
애매한 테스트
테스트 ë‚´ 조건문 로ì§
테스트하기 힘든 코드
테스트 코드 중복
제품 코드 ë‚´ 테스트 로ì§
15장ì—서 다루는 냄새
애매한 테스트
테스트 ë‚´ 조건문 로ì§
테스트하기 힘든 코드
테스트 코드 중복
제품 코드 ë‚´ 테스트 로ì§
애매한 테스트(Obscure Test)
 테스트를 한 ëˆˆì— ì´í•´í•˜ê¸° 어렵다
   긴 테스트, 복잡한 테스트, 장황한 테스트


 ìžë™í…ŒìŠ¤íŠ¸ì˜ ëª©í‘œ
   1. SUTê°€ 어떻게 ë™ìž‘해야 í•˜ëŠ”ê°€ì— ëŒ€í•œ 문서역할
   2. 실행해볼 수 있는 ìžì²´ ê²€ì¦ ëª…ì„¸


 테스트를 실행할 수 있게 구현하다 ë³´ë©´ 복잡해지기 ë•Œë¬¸ì— ì´ ë‘
 가지 목표를 ë™ì‹œì— 만족하기 어렵다.
애매한 테스트(Obscure Test)
 욕심ìŸì´ 테스트
   í•˜ë‚˜ì˜ ë©”ì†Œë“œì—서 너무 ë§Žì€ ê¸°ëŠ¥ì„ ê²€ì¦í•˜ë ¤ëŠ” 테스트
 미스터리한 ì†ë‹˜
   픽스처와 ê²€ì¦ë¡œì§ê°„ì˜ ì¸ê³¼ 관계가 ë³´ì´ì§€ 않는 테스트
 ì¼ë°˜ 픽스처
   기능 ê²€ì¦ì— í•„ìš” ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ ìƒì„±í•˜ê±°ë‚˜ 참조한다
 관련 없는 정보
   ì •ë³´ê°€ 너무 ë§Žì•„ 실제 ë™ìž‘ì— ì˜í–¥ì„ 미치는 ê²ƒì´ ë¬´ì—‡ì¸ì§€ 파악하기 힘들다
 í•˜ë“œì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°
   ë°ì´í„° ê°’ì´ í•˜ë“œ ì½”ë”©ë¼ ìžˆì–´ 입력과 기대 결과값 사ì´ì˜ ì¸ê³¼ 관계가 애매하다
 간접 테스팅
   테스트 메소드와 SUTê°€ 다른 ê°ì²´ë¥¼ 통해 ê°„ì ‘ì ìœ¼ë¡œ ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다

   ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤
   어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다
   픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤
   외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다
   í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다
   '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤
   ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다
   픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다
   테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다
   í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다
   ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다
   ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다
               욕심ìŸì´ 테스트(Eager Test)
   ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤
   어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다
   픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤
   외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다
   í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다
   '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤
   ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다
   픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다
   테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다
   í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다
   ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다
   ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다
              미스터리한 ì†ë‹˜(Mystery Guest)
   ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤
   어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다
   픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤
   외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다
   í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다
   '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤
   ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다
   픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다
   테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다
   í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다
   ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다
   ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다
               ì¼ë°˜ 픽스처(General Fixture)
   ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤
   어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다
   픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤
   외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다
   í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다
   '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤
   ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다
   픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다
   테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다
   í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다
   ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다
   ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다
             관련 없는 정보(Irrelevant Information)
   ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤
   어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다
   픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤
   외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다
   í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다
   '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤
   ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다
   픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다
   테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다
   í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다
   ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다
   ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다
        하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data)
   ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤
   어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다
   픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤
   외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다
   í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다
   '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤
   ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다
   픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다
   테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다
   í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다
   ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다
   ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 • ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다
                 간접 테스팅(Indirect Testing)
   –   ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤
   –   어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다
   –   픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤
   –   외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다
   –   í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다
   –   '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤
   –   ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다
   –   픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다
   –   테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다
   –   í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다
   –   ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다
   –   ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
애매한 테스트(Obscure Test)
 미치는 ì˜í–¥

   ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다
   ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다
   테스트 유지비용 ìƒìŠ¹í•œë‹¤
   버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤
   테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤
   픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다
   ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤
   ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다
   깨지기 쉬운 픽스ì³ê°€ ëœë‹¤
   ëŠë¦° 테스트가 ë  ìˆ˜ 있다
   공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤
   깨지기 쉬운 테스트가 ëœë‹¤
   모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
애매한 테스트(Obscure Test)
 미치는 ì˜í–¥
               욕심ìŸì´ 테스트(Eager Test)
   ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다
   ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다
   테스트 유지비용 ìƒìŠ¹í•œë‹¤
   버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤
   테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤
   픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다
   ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤
   ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다
   깨지기 쉬운 픽스ì³ê°€ ëœë‹¤
   ëŠë¦° 테스트가 ë  ìˆ˜ 있다
   공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤
   깨지기 쉬운 테스트가 ëœë‹¤
   모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
애매한 테스트(Obscure Test)
 미치는 ì˜í–¥
              미스터리한 ì†ë‹˜(Mystery Guest)
   ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다
   ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다
   테스트 유지비용 ìƒìŠ¹í•œë‹¤
   버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤
   테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤
   픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다
   ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤
   ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다
   깨지기 쉬운 픽스ì³ê°€ ëœë‹¤
   ëŠë¦° 테스트가 ë  ìˆ˜ 있다
   공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤
   깨지기 쉬운 테스트가 ëœë‹¤
   모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
애매한 테스트(Obscure Test)
 미치는 ì˜í–¥
               ì¼ë°˜ 픽스처(General Fixture)
   ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다
   ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다
   테스트 유지비용 ìƒìŠ¹í•œë‹¤
   버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤
   테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤
   픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다
   ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤
   ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다
   깨지기 쉬운 픽스ì³ê°€ ëœë‹¤
   ëŠë¦° 테스트가 ë  ìˆ˜ 있다
   공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤
   깨지기 쉬운 테스트가 ëœë‹¤
   모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
애매한 테스트(Obscure Test)
 미치는 ì˜í–¥
             관련 없는 정보(Irrelevant Information)
   ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다
   ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다
   테스트 유지비용 ìƒìŠ¹í•œë‹¤
   버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤
   테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤
   픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다
   ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤
   ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다
   깨지기 쉬운 픽스ì³ê°€ ëœë‹¤
   ëŠë¦° 테스트가 ë  ìˆ˜ 있다
   공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤
   깨지기 쉬운 테스트가 ëœë‹¤
   모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
애매한 테스트(Obscure Test)
 미치는 ì˜í–¥
          하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data)
   ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다
   ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다
   테스트 유지비용 ìƒìŠ¹í•œë‹¤
   버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤
   테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤
   픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다
   ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤
   ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다
   깨지기 쉬운 픽스ì³ê°€ ëœë‹¤
   ëŠë¦° 테스트가 ë  ìˆ˜ 있다
   공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤
   깨지기 쉬운 테스트가 ëœë‹¤
   모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
애매한 테스트(Obscure Test)
 미치는 ì˜í–¥
               간접 테스팅(Indirect Testing)
   ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다
   ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다
   테스트 유지비용 ìƒìŠ¹í•œë‹¤
   버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤
   테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤
   픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다
   ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤
   ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다
   깨지기 쉬운 픽스ì³ê°€ ëœë‹¤
   ëŠë¦° 테스트가 ë  ìˆ˜ 있다
   공유픽스처를 쓸때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤
   깨지기 쉬운 테스트가 ëœë‹¤
   모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
애매한 테스트(Obscure Test)
 ì›ì¸

   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤
   코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다
   코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다
   테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤
   여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다
   테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다
   절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다
   ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다
   테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤
   – 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
애매한 테스트(Obscure Test)
 ì›ì¸
                욕심ìŸì´ 테스트(Eager Test)
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤
   코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다
   코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다
   테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤
   여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다
   테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다
   절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다
   ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다
   테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤
   테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
애매한 테스트(Obscure Test)
 ì›ì¸
                미스터리한 ì†ë‹˜(Mystery Guest)
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤
   코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다
   코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다
   테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤     SUT ë©”ì†Œë“œì— ì „ë‹¬ë˜ëŠ” 외부 파ì¼ì˜ ë‚´ìš©ì´ SUTì˜
   여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 ê²°ì •
                       ë™ìž‘ì„
                       리터럴키로 ì‹ë³„ë˜ëŠ” DB 레코드를 ì½ì–´ ê°ì²´ì— ì“´ ë’¤
   테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 테스트ì—서 사용하거나 SUTì— ì „ë‹¬
                       ì´ë¥¼
   절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다       파ì¼ì—서 ì½ì–´ë“¤ì¸ ë‚´ìš©ì„ ê¸°ëŒ€ê²°ê³¼ê°’ì„ ê²€ì¦í•˜ëŠ” 단
                       ì–¸ 메소드 í˜¸ì¶œì— ì‚¬ìš©
   ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다
                       설치 ë°ì½”ë ˆì´í„°ë¡œ 공유 픽스처를 만들고 ê²°ê³¼ ê²€ì¦
   테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤
                       로ì§ì—서는 공유 í”½ìŠ¤ì²˜ì˜ ê°ì²´ë“¤ì„ 변수로 참조
   테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다 설치로 ì¼ë°˜ 픽스처를 설치하고 테스트 메소
                       암묵ì 
                         드ì—서 ì¸ìŠ¤í„´ìŠ¤ 변수나 í´ëž˜ìФ 변수로 ì ‘ê·¼
애매한 테스트(Obscure Test)
 ì›ì¸
                ì¼ë°˜ 픽스처(General Fixture)
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤
   코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다
   코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다
   테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤
   여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다
   테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다
   절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다
   ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다
   테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤
   테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
애매한 테스트(Obscure Test)
 ì›ì¸
             관련 없는 정보(Irrelevant Information)
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤
   코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다
   코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다
   테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤
   여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다
   테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다
   절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다
   ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다
   테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤
   테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
애매한 테스트(Obscure Test)
 ì›ì¸
         하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data)
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤
   코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다
   코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다
   테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤
   여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다
   테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다
   절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다
   ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다
   테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤
   테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
애매한 테스트(Obscure Test)
 ì›ì¸
                간접 테스팅(Indirect Testing)
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다
   테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤
   코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다
   코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다
   테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤
   여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다
   테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다
   절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다
   ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다
   테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤
   테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
애매한 테스트(Obscure Test)
 í•´ê²°ì±…

   ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다
   ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다
   픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž
   íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다
   최소 픽스처, 신선한 픽스처 사용
   테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다
   관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출
   설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다
   ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤
   복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용
   리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다
   ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다
   SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선
   SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
애매한 테스트(Obscure Test)
 í•´ê²°ì±…
               욕심ìŸì´ 테스트(Eager Test)
   ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다
   ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다
   픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž
   íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다
   최소 픽스처, 신선한 픽스처 사용
   테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다
   관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출
   설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다
   ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤
   복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용
   리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다
   ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다
   SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선
   SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
애매한 테스트(Obscure Test)
 í•´ê²°ì±…
              미스터리한 ì†ë‹˜(Mystery Guest)
   ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다
   ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다
   픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž
   íŒŒì¼ ì´ë¦„ì„ ìž˜ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다
   최소 픽스처, 신선한 픽스처 사용
   테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다
   관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출
   설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다
   ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤
   복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용
   리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다
   ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다
   SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선
   SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
애매한 테스트(Obscure Test)
 í•´ê²°ì±…
               ì¼ë°˜ 픽스처(General Fixture)
   ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다
   ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다
   픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž
   íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다
   최소 픽스처, 신선한 픽스처 사용
   테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다
   관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출
   설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다
   ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤
   복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용
   리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다
   ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다
   SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선
   SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
애매한 테스트(Obscure Test)
 í•´ê²°ì±…
             관련 없는 정보(Irrelevant Information)
   ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다
   ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다
   픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž
   íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다
   최소 픽스처, 신선한 픽스처 사용
   테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다
   관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출
   설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다
   ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤
   복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용
   리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다
   ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다
   SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선
   SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
애매한 테스트(Obscure Test)
 í•´ê²°ì±…
        하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data)
   ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다
   ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다
   픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž
   íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다
   최소 픽스처, 신선한 픽스처 사용
   테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다
   관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출
   설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다
   ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤
   복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용
   리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다
   ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다
   SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선
   SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
애매한 테스트(Obscure Test)
 í•´ê²°ì±…
               간접 테스팅(Indirect Testing)
   ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다
   ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다
   픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž
   íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다
   최소 픽스처, 신선한 픽스처 사용
   테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다
   관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출
   설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다
   ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤
   복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용
   리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다
   ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다
   SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선
   SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
15장ì—서 다루는 냄새
애매한 테스트
테스트 ë‚´ 조건문 로ì§
테스트하기 힘든 코드
테스트 코드 중복
제품 코드 ë‚´ 테스트 로ì§
테스트 ë‚´ 조건문 로ì§(Conditional Test Logic)
 í…ŒìŠ¤íŠ¸ì— ì‹¤í–‰ 안 ë  ìˆ˜ë„ ìžˆëŠ” 코드가 있다
   들쑥날쑥한 테스트 코드


 완전 ìžë™ 테스트는 다른 ì½”ë“œì˜ ë™ìž‘ì„ ê²€ì¦í•˜ëŠ” 코드다
 완전 ìžë™ 테스트 코드가 복잡하다면......?
 테스트를 위한 테스트......?
 테스트가 í•„ìš”ì—†ì„ ì •ë„로 단순하게 만드는 ê²ƒì´ ì •ë‹µ

 테스트 ë‚´ 조건문 로ì§ì€ í•„ìš” ì´ìƒìœ¼ë¡œ 테스트를 복잡하게 만드
 는 ìš”ì¸ ì¤‘ 하나다
테스트 ë‚´ 조건문 로ì§(Conditional Test Logic)
 유연한 테스트
   언제 어디서 실행ë˜ëŠëƒì— ë”°ë¼ ë‹¤ë¥¸ ê¸°ëŠ¥ì„ ê²€ì¦í•˜ëŠ” 테스트
 ê²€ì¦ ì¡°ê±´ë¬¸ 로ì§
   기대 ê²°ê³¼ ê²€ì¦ì— 조건문 사용
 테스트 ë‚´ 제품 로ì§
 복잡한 해체
 여러 테스트 조건
테스트 ë‚´ 조건문 로ì§(Conditional Test Logic)
 ì¦ìƒ : 테스트 코드 ë‚´ì— ë°˜ë³µë¬¸ì´ë‚˜ ì¡°ê±´ë¬¸ì´ ìžˆë‹¤

   테스트가 ìƒí™©ì— ë”°ë¼ ë‹¤ë¥¸ ì¼ì„ í•  수 있게 조건문 로ì§ì´ 들어 있다
   í…ŒìŠ¤íŠ¸ì˜ ê²°ê³¼ ê²€ì¦ë¶€ì— 조건문 로ì§ì´ 들어있다
   픽스처 해체 코드가 복잡하다
   여러 입력값과 ê·¸ 기대 ê²°ê³¼ê°’ì— ê°™ì€ í…ŒìŠ¤íŠ¸ ë¡œì§ ì ìš©
테스트 ë‚´ 조건문 로ì§(Conditional Test Logic)
 미치는 ì˜í–¥

   테스트 코드ì—서 ë¬´ì—‡ì„ í•˜ëŠ”ì§€ 알기 어렵다
   테스트가 ê²°ì •ë¡ ì ì´ì§€ 않아 디버깅하기 어렵다
   어려운 ìž‘ì—…ì— ëŒ€í•´ 테스트를 정확하게 작성하기 어렵다
   테스트가 ì´í•´í•˜ê¸° 어려워 유지보수가 힘들다
   모든 제어경로가 테스트 ë˜ì—ˆëŠ”ì§€ 알 수 없다
테스트 ë‚´ 조건문 로ì§(Conditional Test Logic)
 ì›ì¸

   SUTê°€ 올바른 ë°ì´í„°ë¥¼ 반환하지 ì•Šì•˜ì„ ë•Œì˜ if문 처리
   여러 ê°ì œë¥¼ í•œêº¼ë²ˆì— ê²€ì¦í•˜ê¸° 위해 반복문 사용
   복잡한 ê°ì²´ë‚˜ 다형성 ë°ì´í„° 구조를 ê²€ì¦
   테스트 픽스처나 기대 ê°ì²´ 초기화시 í•˜ë‚˜ì˜ í…ŒìŠ¤íŠ¸ì—서 여러 다른 경우 ê²€ì¦
   존재하지 않는 픽스처 ê°ì²´ë¥¼ 해체하지 않기 위해 if문 사용
   í™˜ê²½ì— ëŒ€í•œ 제어능력 부족
   가비지 컬렉션 ì‹œìŠ¤í…œì´ í•´ê²°í•´ 줄 수 없는 ì§€ì†ì ì¸ ìžì›ì„ ë§Žì´ ì‚¬ìš©
테스트 ë‚´ 조건문 로ì§(Conditional Test Logic)
 í•´ê²°ì±…

   SUTì—서 '바꿀 수 있는 ì˜ì¡´'ì„ ì§€ì›í•˜ê²Œ 리팩토ë§í•œë‹¤
   보호 단언문 사용
   복잡한 ê°ì²´ë¥¼ ê²€ì¦í•  때는 기대ê°ì²´ì— ë™ë“± 단언문 사용
   테스트용 ë™ë“±ì„ ì •ì˜í•œ 맞춤 단언문 사용
   테스트 유틸리티 메소드나 공통 ì¸ìžë¥¼ 받는 테스트 사용
   ìž…ë ¥ëœ ê°’ì— ëŒ€í•œ ê³„ì‚°ëœ ê°’ì„ ì“´ë‹¤
   ì•”ë¬µì  í•´ì²´, ìžë™ í•´ì²´ 사용
   신선한 픽스처, 테스트 ëŒ€ì—­ì„ ì‚¬ìš©í•´ ì§€ì†ë˜ëŠ” ê°ì²´ë¥¼ ì“°ì§€ 않는다
15장ì—서 다루는 냄새
애매한 테스트
테스트 ë‚´ 조건문 로ì§
테스트하기 힘든 코드
테스트 코드 중복
제품 코드 ë‚´ 테스트 로ì§
테스트하기 힘든 코드(Hard-to-Test Code)
 코드가 테스트 하기 어렵다

  강하게 ê²°í•©ëœ ì½”ë“œ
  비ë™ê¸° 코드
  테스트할 수 없는 테스트 코드
테스트하기 힘든 코드(Hard-to-Test Code)
 ì¦ìƒ

   ì›ëž˜ë¶€í„° 테스트 하기 힘든 코드
   여러 다른 í´ëž˜ìŠ¤ì™€ 함께 테스트 해야만 하는 코드
   ì§ì ‘ 메소드 호출로 테스트할 수 없는 í´ëž˜ìФ
   테스트 ë©”ì†Œë“œì˜ ë‚´ìš©ì´ ë³µìž¡í•˜ë‹¤
   테스트가 올바른지 확신할 수 없다
테스트하기 힘든 코드(Hard-to-Test Code)
 미치는 ì˜í–¥

   ì½”ë“œì˜ í’ˆì§ˆì„ ì‰½ê²Œ ê²€ì¦í•  수 없다
   테스트 ë¬¸ì„œí™”ì— í° ê³µì„ ë“¤ì´ì§€ 않으면 품질 í‰ê°€ë¥¼ 반복하기 어렵다
   단위 테스트가 어렵다
   테스트가 복잡하고 ì‹¤í–‰ì´ ëŠë ¤ì§„다
   ë²„ê·¸íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ë˜ê¸° 쉽다
   테스트 유지 ë¹„ìš©ì´ ë¹„ì‹¸ë‹¤
   테스트를 제대로 작성하기 어렵다
테스트하기 힘든 코드(Hard-to-Test Code)
 ì›ì¸

   설계가 조잡하다
   ê°ì²´ì§€í–¥ ì„¤ê³„ê²½í—˜ì´ ë¶€ì¡±í•˜ë‹¤
   액티브 ê°ì²´ì™€ 강하게 ê²°í•©ë˜ì–´ 있다
   ë°ìŠ¤íŠ¸ì½”ë“œëŠ” ì›ëž˜ 테스트하기 어렵다
테스트하기 힘든 코드(Hard-to-Test Code)
 í•´ê²°ì±…

   ê²°í•©ì„ ë¶„ë¦¬í•œë‹¤ : 테스트 대역, 테스트 스í…, ëª¨ì˜ ê°ì²´
   '레거시 코드 활용 ì „ëžµ'ì„ ì½ì–´ë³¸ë‹¤
   로ì§ê³¼ 비ë™ê¸° ì ‘ê·¼ 매커니즘 분리 : 대강 만든 ê°ì²´
   테스트 메소드들 아주 단순하게 만든다
15장ì—서 다루는 냄새
애매한 테스트
테스트 ë‚´ 조건문 로ì§
테스트하기 힘든 코드
테스트 코드 중복
제품 코드 ë‚´ 테스트 로ì§
테스트 코드 중복(Test Code Duplication)
 여러 번 반복ë˜ëŠ” 테스트 코드
   ê°™ì€ ì£¼ì œì— ëŒ€í•´ 약간씩 다른 시나리오로 테스트 해야 하는 경우


   'ìž˜ë¼ ë¶™ì—¬ë„£ê¸°' 코드 재사용
   바퀴 재발명 하기
테스트 코드 중복(Test Code Duplication)
 ì¦ìƒ

   ê°™ì€ ì½”ë“œê°€ 여러 테스트ì—서 반복ëœë‹¤
   한 테스트 안ì—서 비슷한 êµ¬ë¬¸ì´ ë°˜ë³µëœë‹¤


 미치는 ì˜í–¥

   SUT메소드 ì˜ë¯¸ê°€ 변경ë˜ë©´ 모든 ë³µì‚¬ë³¸ì— ìœ ì§€ë³´ìˆ˜ 해야한다
   테스트 유지 ë¹„ìš©ì´ ëŠ˜ì–´ë‚œë‹¤
테스트 코드 중복(Test Code Duplication)
 ì›ì¸

   ë¦¬íŒ©í† ë§ ê¸°ìˆ ì´ë‚˜ ê²½í—˜ì´ ë¶€ì¡±
   ì¼ì •ì— ëŒ€í•œ ì••ë°•
   어떤 테스트 유틸리티 메소드가 있는지 모른다


 í•´ê²°ì±…

   메소트 뽑아내기
   ìƒì„± 메소드, 찾기 메소드
   맞춤 단언문, ê²€ì¦ ë©”ì†Œë“œ
   'ì¸ìž ë„ìž…' 리팩토ë§
   테스트 유틸리티 메소드 확ì¸
15장ì—서 다루는 냄새
애매한 테스트
테스트 ë‚´ 조건문 로ì§
테스트하기 힘든 코드
테스트 코드 중복
제품 코드 ë‚´ 테스트 로ì§
제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production)
 제품 ì½”ë“œì— í…ŒìŠ¤íŠ¸ì—서만 실행ë¼ì•¼ 하는 코드가 들어있다

   테스트 훅
   테스트 전용
   제품 코드 ë‚´ 테스트 ì˜ì¡´
   ë™ë“± 오염
제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production)
 ì¦ìƒ

   순전히 테스트ì—서만 필요한 로ì§ì´ SUTì•ˆì— ë“¤ì–´ 있다
   SUTê°€ 테스트 중ì¼ë•Œ 다르게 실행ë˜ëŠ” 로ì§ì´ 있다
   SUTì¼ë¶€ 메소드가 테스트ì—서만 ì“°ì´ê³  있다
   실제 private ì´ì–´ì•¼ 하는 ì†ì„±ì´ public 으로 ë¼ ìžˆë‹¤
   제품 코드만 빌드할 수가 없다
   테스트 ì‹¤í–‰ì´ ì—†ëŠ” 경우 제품 코드를 실행할 수 없다
   테스트ì—ì„œì˜ í•„ìš”ë¡œ equals 메소드를 변경
   SUTì—서 equals ì˜ ì •ì˜ë¥¼ 변경
제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production)
 미치는 ì˜í–¥

   제품 ìƒíƒœì—서 테스트 코드가 실행ë˜ë©´ 심ê°í•œ 문제가 ìƒê¸¸ 수 있다
   SUT를 ë” ë³µìž¡í•˜ê²Œ 만든다
   ì œí’ˆì˜ ì‹¤í–‰ í¬ê¸°ê°€ 늘어난다
   제품ì—서 뜻하지 않게 테스트 코드가 ì‹¤í–‰ë  ìˆ˜ 있다
   새로운 ìš”êµ¬ì‚¬í•­ì„ ì§€ì›í•˜ëŠ” equals 로ì§ì„ 추가하기 어렵다


 ì›ì¸

   알려진 ê°’ì„ ë¦¬í„´í•´ SUTë™ìž‘ì„ ê²°ì •ì ìœ¼ë¡œ 만든다
   í…ŒìŠ¤íŠ¸ì— í•„ìš”í•œ 정보를 í´ëž˜ìŠ¤ë¡œë¶€í„° 노출
   í…ŒìŠ¤íŠ¸ì— í•„ìš”í•œ ì •ë³´ ì´ˆê¸°í™”ì— ë” ë§Žì€ ì œì–´ë¥¼ 하기 위한 메소드 추가
   모듈간 ì˜ì¡´ì„±ì— ì‹ ê²½ì„ ì“°ì§€ 않는다
   테스트용 ë™ë“±ì˜ ê°œë…ì„ ìž˜ 모른다
제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production)
 í•´ê²°ì±…

   바꿀 수 있는 ì˜ì¡´ 사용 : 스트레티지 패턴
   테스트용 하위í´ëž˜ìŠ¤ë¥¼ 만들어 SUTì˜ íŠ¹ì • 메소드를 오버ë¼ì´ë”©í•œë‹¤
   테스트 ì „ìš©ìž„ì„ ë¶„ëª…í•˜ê²Œ 네ì´ë°ì„ 한다
   ì˜ì¡´ê´€ê³„를 신중히 관리한다
   equals 수정 대신 맞춤 단언문으로 내장 ë™ë“± ë‹¨ì–¸ë¬¸ì„ ì“°ê²Œ 한다
   ë™ì  ëª¨ì˜ ê°ì²´ ìƒì„± ë„구를 쓴다면 비êµìžë¥¼ 쓴다
   기대 ê°ì²´ì˜ 테스트용 하위 í´ëž˜ìŠ¤ì— equals 메소드를 구현한다
ë
Ad

Recommended

Effective Unit Testing
Effective Unit Testing
Yeon Soo Kim
Ìý
TDD with JUnit 2
TDD with JUnit 2
Junyoung Lee
Ìý
xUnitTestPattern/chapter16
xUnitTestPattern/chapter16
suitzero
Ìý
TDD - Test Driven Development
TDD - Test Driven Development
ChangHyeon Bae
Ìý
목 오브ì íЏ(Mock Object)ì˜ ì´í•´
목 오브ì íЏ(Mock Object)ì˜ ì´í•´
Yong Hoon Kim
Ìý
Effective unit testing - 좋은á„ᅦ스á„á…³ 요약
Effective unit testing - 좋은á„ᅦ스á„á…³ 요약
YongEun Choi
Ìý
5장. 그래프와 트리 (3,4)
5장. 그래프와 트리 (3,4)
SH Park
Ìý
Design Pattern In Functional Language
Design Pattern In Functional Language
SH Park
Ìý
PrimesIsInP
PrimesIsInP
SH Park
Ìý
Introduction to prolog
Introduction to prolog
SH Park
Ìý
4장 스í¬ì¸  시뮬레ì´ì…˜ - 단순 축구
4장 스í¬ì¸  시뮬레ì´ì…˜ - 단순 축구
SH Park
Ìý
ë„ë©”ì¸ ì£¼ë„ ì„¤ê³„ - 16 대규모 구조
ë„ë©”ì¸ ì£¼ë„ ì„¤ê³„ - 16 대규모 구조
SH Park
Ìý
Apprenticeship patterns chapter4
Apprenticeship patterns chapter4
SH Park
Ìý
í”„ë¡œê·¸ëž˜ë¨¸ì˜ ê¸¸,멘토ì—게 묻다 2장
í”„ë¡œê·¸ëž˜ë¨¸ì˜ ê¸¸,멘토ì—게 묻다 2장
hyun soomyung
Ìý
Nodejs_chapter9
Nodejs_chapter9
SH Park
Ìý
Istqb 2-소프트웨어수명주기와테스팅-2015
Istqb 2-소프트웨어수명주기와테스팅-2015
Jongwon Lee
Ìý
테스트 ìžë™í™”ì˜ ì›ì¹™
테스트 ìžë™í™”ì˜ ì›ì¹™
codevania
Ìý
xUnitTestPattern/chapter17
xUnitTestPattern/chapter17
Yoon Hee Hwang
Ìý
Istqb 1-소프트웨어테스팅기초-2015
Istqb 1-소프트웨어테스팅기초-2015
Jongwon Lee
Ìý
KGC2010 - ë‚¡ì€ ì½”ë“œì— ë‹¨ìœ„í…ŒìŠ¤íŠ¸ 넣기
KGC2010 - ë‚¡ì€ ì½”ë“œì— ë‹¨ìœ„í…ŒìŠ¤íŠ¸ 넣기
Ryan Park
Ìý
아꿈사.C++ api ë””ìžì¸.20140315 a
아꿈사.C++ api ë””ìžì¸.20140315 a
Choonghyun Yang
Ìý
Istqb 5-테스트관리-2015-ë°°í¬
Istqb 5-테스트관리-2015-ë°°í¬
Jongwon Lee
Ìý
ì—”ì§€ë‹ˆì–´ì˜ í•™ìŠµ, 그리고 테스트 코드
ì—”ì§€ë‹ˆì–´ì˜ í•™ìŠµ, 그리고 테스트 코드
Mijeong Park
Ìý
°Õ¶Ù¶Ù.´³±«²Ô¾±³Ù.조금ë”.알기
°Õ¶Ù¶Ù.´³±«²Ô¾±³Ù.조금ë”.알기
Wonchang Song
Ìý
Istqb 1-소프트웨어테스팅기초
Istqb 1-소프트웨어테스팅기초
Jongwon Lee
Ìý
KSUG 스프ë§ìº í”„ 2019 발표ìžë£Œ - "ë¬´ì—‡ì„ í…ŒìŠ¤íŠ¸í•  것ì¸ê°€, 어떻게 테스트할 것ì¸ê°€"
KSUG 스프ë§ìº í”„ 2019 발표ìžë£Œ - "ë¬´ì—‡ì„ í…ŒìŠ¤íŠ¸í•  것ì¸ê°€, 어떻게 테스트할 것ì¸ê°€"
용근 권
Ìý
X unittestpattern 1장_아꿈사
X unittestpattern 1장_아꿈사
íš¨ì› ê°•
Ìý
테스트 냄새
테스트 냄새
SukYun Yoon
Ìý

More Related Content

Viewers also liked (7)

PrimesIsInP
PrimesIsInP
SH Park
Ìý
Introduction to prolog
Introduction to prolog
SH Park
Ìý
4장 스í¬ì¸  시뮬레ì´ì…˜ - 단순 축구
4장 스í¬ì¸  시뮬레ì´ì…˜ - 단순 축구
SH Park
Ìý
ë„ë©”ì¸ ì£¼ë„ ì„¤ê³„ - 16 대규모 구조
ë„ë©”ì¸ ì£¼ë„ ì„¤ê³„ - 16 대규모 구조
SH Park
Ìý
Apprenticeship patterns chapter4
Apprenticeship patterns chapter4
SH Park
Ìý
í”„ë¡œê·¸ëž˜ë¨¸ì˜ ê¸¸,멘토ì—게 묻다 2장
í”„ë¡œê·¸ëž˜ë¨¸ì˜ ê¸¸,멘토ì—게 묻다 2장
hyun soomyung
Ìý
Nodejs_chapter9
Nodejs_chapter9
SH Park
Ìý
PrimesIsInP
PrimesIsInP
SH Park
Ìý
Introduction to prolog
Introduction to prolog
SH Park
Ìý
4장 스í¬ì¸  시뮬레ì´ì…˜ - 단순 축구
4장 스í¬ì¸  시뮬레ì´ì…˜ - 단순 축구
SH Park
Ìý
ë„ë©”ì¸ ì£¼ë„ ì„¤ê³„ - 16 대규모 구조
ë„ë©”ì¸ ì£¼ë„ ì„¤ê³„ - 16 대규모 구조
SH Park
Ìý
Apprenticeship patterns chapter4
Apprenticeship patterns chapter4
SH Park
Ìý
í”„ë¡œê·¸ëž˜ë¨¸ì˜ ê¸¸,멘토ì—게 묻다 2장
í”„ë¡œê·¸ëž˜ë¨¸ì˜ ê¸¸,멘토ì—게 묻다 2장
hyun soomyung
Ìý
Nodejs_chapter9
Nodejs_chapter9
SH Park
Ìý

Similar to xunittestpatternchapter15 (20)

Istqb 2-소프트웨어수명주기와테스팅-2015
Istqb 2-소프트웨어수명주기와테스팅-2015
Jongwon Lee
Ìý
테스트 ìžë™í™”ì˜ ì›ì¹™
테스트 ìžë™í™”ì˜ ì›ì¹™
codevania
Ìý
xUnitTestPattern/chapter17
xUnitTestPattern/chapter17
Yoon Hee Hwang
Ìý
Istqb 1-소프트웨어테스팅기초-2015
Istqb 1-소프트웨어테스팅기초-2015
Jongwon Lee
Ìý
KGC2010 - ë‚¡ì€ ì½”ë“œì— ë‹¨ìœ„í…ŒìŠ¤íŠ¸ 넣기
KGC2010 - ë‚¡ì€ ì½”ë“œì— ë‹¨ìœ„í…ŒìŠ¤íŠ¸ 넣기
Ryan Park
Ìý
아꿈사.C++ api ë””ìžì¸.20140315 a
아꿈사.C++ api ë””ìžì¸.20140315 a
Choonghyun Yang
Ìý
Istqb 5-테스트관리-2015-ë°°í¬
Istqb 5-테스트관리-2015-ë°°í¬
Jongwon Lee
Ìý
ì—”ì§€ë‹ˆì–´ì˜ í•™ìŠµ, 그리고 테스트 코드
ì—”ì§€ë‹ˆì–´ì˜ í•™ìŠµ, 그리고 테스트 코드
Mijeong Park
Ìý
°Õ¶Ù¶Ù.´³±«²Ô¾±³Ù.조금ë”.알기
°Õ¶Ù¶Ù.´³±«²Ô¾±³Ù.조금ë”.알기
Wonchang Song
Ìý
Istqb 1-소프트웨어테스팅기초
Istqb 1-소프트웨어테스팅기초
Jongwon Lee
Ìý
KSUG 스프ë§ìº í”„ 2019 발표ìžë£Œ - "ë¬´ì—‡ì„ í…ŒìŠ¤íŠ¸í•  것ì¸ê°€, 어떻게 테스트할 것ì¸ê°€"
KSUG 스프ë§ìº í”„ 2019 발표ìžë£Œ - "ë¬´ì—‡ì„ í…ŒìŠ¤íŠ¸í•  것ì¸ê°€, 어떻게 테스트할 것ì¸ê°€"
용근 권
Ìý
X unittestpattern 1장_아꿈사
X unittestpattern 1장_아꿈사
íš¨ì› ê°•
Ìý
테스트 냄새
테스트 냄새
SukYun Yoon
Ìý
『Effective Unit Testing〠- 맛보기
『Effective Unit Testing〠- 맛보기
복연 ì´
Ìý
xUnitTestPattern/chapter12
xUnitTestPattern/chapter12
Hyosung Jeon
Ìý
testing for agile?, agile for testing
testing for agile?, agile for testing
SangIn Choung
Ìý
구글테스트
구글테스트
ì§„í™” ì†
Ìý
[H3 2012] 행복한 ê°œë°œì„ ìœ„í•œ 테스트 ì¼€ì´ìФ
[H3 2012] 행복한 ê°œë°œì„ ìœ„í•œ 테스트 ì¼€ì´ìФ
KTH, ì¼€ì´í‹°í•˜ì´í…”
Ìý
Istqb 2-소프트웨어수명주기와테스팅-2015
Istqb 2-소프트웨어수명주기와테스팅-2015
Jongwon Lee
Ìý
테스트 ìžë™í™”ì˜ ì›ì¹™
테스트 ìžë™í™”ì˜ ì›ì¹™
codevania
Ìý
xUnitTestPattern/chapter17
xUnitTestPattern/chapter17
Yoon Hee Hwang
Ìý
Istqb 1-소프트웨어테스팅기초-2015
Istqb 1-소프트웨어테스팅기초-2015
Jongwon Lee
Ìý
KGC2010 - ë‚¡ì€ ì½”ë“œì— ë‹¨ìœ„í…ŒìŠ¤íŠ¸ 넣기
KGC2010 - ë‚¡ì€ ì½”ë“œì— ë‹¨ìœ„í…ŒìŠ¤íŠ¸ 넣기
Ryan Park
Ìý
아꿈사.C++ api ë””ìžì¸.20140315 a
아꿈사.C++ api ë””ìžì¸.20140315 a
Choonghyun Yang
Ìý
Istqb 5-테스트관리-2015-ë°°í¬
Istqb 5-테스트관리-2015-ë°°í¬
Jongwon Lee
Ìý
ì—”ì§€ë‹ˆì–´ì˜ í•™ìŠµ, 그리고 테스트 코드
ì—”ì§€ë‹ˆì–´ì˜ í•™ìŠµ, 그리고 테스트 코드
Mijeong Park
Ìý
°Õ¶Ù¶Ù.´³±«²Ô¾±³Ù.조금ë”.알기
°Õ¶Ù¶Ù.´³±«²Ô¾±³Ù.조금ë”.알기
Wonchang Song
Ìý
Istqb 1-소프트웨어테스팅기초
Istqb 1-소프트웨어테스팅기초
Jongwon Lee
Ìý
KSUG 스프ë§ìº í”„ 2019 발표ìžë£Œ - "ë¬´ì—‡ì„ í…ŒìŠ¤íŠ¸í•  것ì¸ê°€, 어떻게 테스트할 것ì¸ê°€"
KSUG 스프ë§ìº í”„ 2019 발표ìžë£Œ - "ë¬´ì—‡ì„ í…ŒìŠ¤íŠ¸í•  것ì¸ê°€, 어떻게 테스트할 것ì¸ê°€"
용근 권
Ìý
X unittestpattern 1장_아꿈사
X unittestpattern 1장_아꿈사
íš¨ì› ê°•
Ìý
테스트 냄새
테스트 냄새
SukYun Yoon
Ìý
『Effective Unit Testing〠- 맛보기
『Effective Unit Testing〠- 맛보기
복연 ì´
Ìý
xUnitTestPattern/chapter12
xUnitTestPattern/chapter12
Hyosung Jeon
Ìý
testing for agile?, agile for testing
testing for agile?, agile for testing
SangIn Choung
Ìý
구글테스트
구글테스트
ì§„í™” ì†
Ìý
[H3 2012] 행복한 ê°œë°œì„ ìœ„í•œ 테스트 ì¼€ì´ìФ
[H3 2012] 행복한 ê°œë°œì„ ìœ„í•œ 테스트 ì¼€ì´ìФ
KTH, ì¼€ì´í‹°í•˜ì´í…”
Ìý
Ad

xunittestpatternchapter15

  • 1. xUnit Test Pattern 15장. 코드 냄새 ë°•ìƒí˜ http://pixelmine.tistory.com 아꿈사 http://andstudy.com
  • 2. 15장ì—서 다루는 냄새 애매한 테스트 테스트 ë‚´ 조건문 ë¡œì§ í…ŒìŠ¤íŠ¸í•˜ê¸° 힘든 코드 테스트 코드 중복 제품 코드 ë‚´ 테스트 로ì§
  • 3. 15장ì—서 다루는 냄새 애매한 테스트 테스트 ë‚´ 조건문 ë¡œì§ í…ŒìŠ¤íŠ¸í•˜ê¸° 힘든 코드 테스트 코드 중복 제품 코드 ë‚´ 테스트 로ì§
  • 4. 애매한 테스트(Obscure Test) 테스트를 한 ëˆˆì— ì´í•´í•˜ê¸° 어렵다 긴 테스트, 복잡한 테스트, 장황한 테스트 ìžë™í…ŒìŠ¤íŠ¸ì˜ ëª©í‘œ 1. SUTê°€ 어떻게 ë™ìž‘해야 í•˜ëŠ”ê°€ì— ëŒ€í•œ 문서역할 2. 실행해볼 수 있는 ìžì²´ ê²€ì¦ ëª…ì„¸ 테스트를 실행할 수 있게 구현하다 ë³´ë©´ 복잡해지기 ë•Œë¬¸ì— ì´ ë‘ ê°€ì§€ 목표를 ë™ì‹œì— 만족하기 어렵다.
  • 5. 애매한 테스트(Obscure Test) 욕심ìŸì´ 테스트 í•˜ë‚˜ì˜ ë©”ì†Œë“œì—서 너무 ë§Žì€ ê¸°ëŠ¥ì„ ê²€ì¦í•˜ë ¤ëŠ” 테스트 미스터리한 ì†ë‹˜ 픽스처와 ê²€ì¦ë¡œì§ê°„ì˜ ì¸ê³¼ 관계가 ë³´ì´ì§€ 않는 테스트 ì¼ë°˜ 픽스처 기능 ê²€ì¦ì— í•„ìš” ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ ìƒì„±í•˜ê±°ë‚˜ 참조한다 관련 없는 ì •ë³´ ì •ë³´ê°€ 너무 ë§Žì•„ 실제 ë™ìž‘ì— ì˜í–¥ì„ 미치는 ê²ƒì´ ë¬´ì—‡ì¸ì§€ 파악하기 힘들다 í•˜ë“œì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„° ë°ì´í„° ê°’ì´ í•˜ë“œ ì½”ë”©ë¼ ìžˆì–´ 입력과 기대 결과값 사ì´ì˜ ì¸ê³¼ 관계가 애매하다 ê°„ì ‘ 테스팅 테스트 메소드와 SUTê°€ 다른 ê°ì²´ë¥¼ 통해 ê°„ì ‘ì ìœ¼ë¡œ ìƒí˜¸ìž‘용한다
  • 6. 애매한 테스트(Obscure Test) ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다 ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤ 어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다 픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤ 외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다 í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다 '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤ ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다 픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다 테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다 í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다 ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다 ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
  • 7. 애매한 테스트(Obscure Test) ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다 욕심ìŸì´ 테스트(Eager Test) ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤ 어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다 픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤ 외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다 í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다 '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤ ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다 픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다 테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다 í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다 ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다 ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
  • 8. 애매한 테스트(Obscure Test) ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다 미스터리한 ì†ë‹˜(Mystery Guest) ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤ 어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다 픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤ 외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다 í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다 '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤ ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다 픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다 테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다 í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다 ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다 ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
  • 9. 애매한 테스트(Obscure Test) ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다 ì¼ë°˜ 픽스처(General Fixture) ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤ 어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다 픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤ 외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다 í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다 '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤ ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다 픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다 테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다 í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다 ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다 ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
  • 10. 애매한 테스트(Obscure Test) ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다 관련 없는 ì •ë³´(Irrelevant Information) ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤ 어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다 픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤ 외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다 í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다 '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤ ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다 픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다 테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다 í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다 ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다 ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
  • 11. 애매한 테스트(Obscure Test) ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다 하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data) ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤ 어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다 픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤ 외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다 í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다 '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤ ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다 픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다 테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다 í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다 ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다 ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
  • 12. 애매한 테스트(Obscure Test) • ì¦ìƒ : 테스트ì—서 ê²€ì¦í•˜ëŠ” ë™ìž‘ì„ ì´í•´í•˜ê¸° 힘들다 ê°„ì ‘ 테스팅(Indirect Testing) – ì´ê²ƒ 저것 '없는 ê±° 빼고 ì „ë¶€ 다' ê²€ì¦í•œë‹¤ – 어디까지가 픽스처 설치ì¸ì§€, 어디서부터 SUT실행부ì¸ì§€ 알기 어렵다 – 픽스처 설치나 ê²°ê³¼ ê²€ì¦ë¶€ê°€ 테스트ì—서 ë³¼ 수 없는 ì •ë³´ì— ì˜ì¡´í•œë‹¤ – 외부 정보를 찾지 않고는 ë™ìž‘ì„ ì´í•´í•˜ê¸° 어렵다 – í•„ìš”ì´ìƒìœ¼ë¡œ í° í”½ìŠ¤ì²˜ë¥¼ 구축한다 – '픽스처-SUT실행-결과값' 사ì´ì˜ ì¸ê³¼ê´€ê³„ íŒŒì•…ì´ íž˜ë“¤ë‹¤ – ê°ì²´ì— 전달ë˜ëŠ” ê°’ 중 ë¬´ì—‡ì´ ê¸°ëŒ€ì¶œë ¥ì— ì˜í–¥ì„ 주는지 알기 어렵다 – 픽스처 설치 로ì§ì´ 길고, ë¬´ì—‡ì„ ê²€ì¦í•˜ë ¤ëŠ”ì§€ 알기 어렵다 – 테스트 ê²€ì¦ ì½”ë“œê°€ 복잡하다 – í•˜ë“œì½”ë”©ëœ ê°’ì´ ì–´ë–»ê²Œ 서로 관련ë˜ì–´ 있는지 알기 어렵다 – ì–´ë–¤ ê°’ë“¤ì´ SUTì˜ ë™ìž‘ì— ì˜í–¥ì„ 주는지 알기 어렵다 – ê²€ì¦í•´ì•¼ 하는 ê°ì²´ê°€ 아닌 다른 ê°ì²´ì™€ 주로 ìƒí˜¸ìž‘용한다
  • 13. 애매한 테스트(Obscure Test) 미치는 ì˜í–¥ ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다 ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다 테스트 유지비용 ìƒìŠ¹í•œë‹¤ 버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤ 테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤ 픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다 ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤ ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다 깨지기 쉬운 픽스ì³ê°€ ëœë‹¤ ëŠë¦° 테스트가 ë  ìˆ˜ 있다 공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤ 깨지기 쉬운 테스트가 ëœë‹¤ 모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
  • 14. 애매한 테스트(Obscure Test) 미치는 ì˜í–¥ 욕심ìŸì´ 테스트(Eager Test) ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다 ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다 테스트 유지비용 ìƒìŠ¹í•œë‹¤ 버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤ 테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤ 픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다 ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤ ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다 깨지기 쉬운 픽스ì³ê°€ ëœë‹¤ ëŠë¦° 테스트가 ë  ìˆ˜ 있다 공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤ 깨지기 쉬운 테스트가 ëœë‹¤ 모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
  • 15. 애매한 테스트(Obscure Test) 미치는 ì˜í–¥ 미스터리한 ì†ë‹˜(Mystery Guest) ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다 ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다 테스트 유지비용 ìƒìŠ¹í•œë‹¤ 버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤ 테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤ 픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다 ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤ ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다 깨지기 쉬운 픽스ì³ê°€ ëœë‹¤ ëŠë¦° 테스트가 ë  ìˆ˜ 있다 공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤ 깨지기 쉬운 테스트가 ëœë‹¤ 모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
  • 16. 애매한 테스트(Obscure Test) 미치는 ì˜í–¥ ì¼ë°˜ 픽스처(General Fixture) ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다 ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다 테스트 유지비용 ìƒìŠ¹í•œë‹¤ 버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤ 테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤ 픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다 ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤ ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다 깨지기 쉬운 픽스ì³ê°€ ëœë‹¤ ëŠë¦° 테스트가 ë  ìˆ˜ 있다 공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤ 깨지기 쉬운 테스트가 ëœë‹¤ 모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
  • 17. 애매한 테스트(Obscure Test) 미치는 ì˜í–¥ 관련 없는 ì •ë³´(Irrelevant Information) ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다 ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다 테스트 유지비용 ìƒìŠ¹í•œë‹¤ 버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤ 테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤ 픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다 ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤ ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다 깨지기 쉬운 픽스ì³ê°€ ëœë‹¤ ëŠë¦° 테스트가 ë  ìˆ˜ 있다 공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤ 깨지기 쉬운 테스트가 ëœë‹¤ 모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
  • 18. 애매한 테스트(Obscure Test) 미치는 ì˜í–¥ 하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data) ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다 ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다 테스트 유지비용 ìƒìŠ¹í•œë‹¤ 버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤ 테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤ 픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다 ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤ ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다 깨지기 쉬운 픽스ì³ê°€ ëœë‹¤ ëŠë¦° 테스트가 ë  ìˆ˜ 있다 공유픽스처를 쓸 때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤ 깨지기 쉬운 테스트가 ëœë‹¤ 모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
  • 19. 애매한 테스트(Obscure Test) 미치는 ì˜í–¥ ê°„ì ‘ 테스팅(Indirect Testing) ì´í•´í•˜ê¸° 힘들고 유지보수가 어렵다 ë¬¸ì„œë¡œì„œì˜ í…ŒìŠ¤íŠ¸ë¥¼ 만들기 어렵다 테스트 유지비용 ìƒìŠ¹í•œë‹¤ 버그 íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ëœë‹¤ 테스트 디버깅 ë°ì´í„°ë¥¼ 잃게 ëœë‹¤ 픽스처와 기대결과 사ì´ì˜ ì¸ê³¼ê´€ê³„를 알기 어렵다 ë³€ë•스러운 테스트가 ìƒê¸´ë‹¤ ê° í…ŒìŠ¤íŠ¸ì—서 픽스처를 어떻게 사용하는지 ì´í•´í•˜ê¸° 힘들다 깨지기 쉬운 픽스ì³ê°€ ëœë‹¤ ëŠë¦° 테스트가 ë  ìˆ˜ 있다 공유픽스처를 쓸때 다른 테스트ì—서 ê°™ì€ ê°’ì„ ì“°ëŠ” 경우 ì¶©ëŒì´ ìƒê¸´ë‹¤ 깨지기 쉬운 테스트가 ëœë‹¤ 모든 ê³³ì„ í…ŒìŠ¤íŠ¸ 하기 불가능하다
  • 20. 애매한 테스트(Obscure Test) ì›ì¸ 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤ 코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다 코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다 테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤ 여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다 ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다 테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤ – 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
  • 21. 애매한 테스트(Obscure Test) ì›ì¸ 욕심ìŸì´ 테스트(Eager Test) 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤ 코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다 코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다 테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤ 여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다 ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다 테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤ 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
  • 22. 애매한 테스트(Obscure Test) ì›ì¸ 미스터리한 ì†ë‹˜(Mystery Guest) 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤ 코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다 코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다 테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤ SUT ë©”ì†Œë“œì— ì „ë‹¬ë˜ëŠ” 외부 파ì¼ì˜ ë‚´ìš©ì´ SUTì˜ ì—¬ëŸ¬ 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 ê²°ì • ë™ìž‘ì„ ë¦¬í„°ëŸ´í‚¤ë¡œ ì‹ë³„ë˜ëŠ” DB 레코드를 ì½ì–´ ê°ì²´ì— ì“´ ë’¤ 테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 테스트ì—서 사용하거나 SUTì— ì „ë‹¬ ì´ë¥¼ 절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다 파ì¼ì—서 ì½ì–´ë“¤ì¸ ë‚´ìš©ì„ ê¸°ëŒ€ê²°ê³¼ê°’ì„ ê²€ì¦í•˜ëŠ” 단 ì–¸ 메소드 í˜¸ì¶œì— ì‚¬ìš© ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다 설치 ë°ì½”ë ˆì´í„°ë¡œ 공유 픽스처를 만들고 ê²°ê³¼ ê²€ì¦ í…ŒìŠ¤íŠ¸ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤ 로ì§ì—서는 공유 í”½ìŠ¤ì²˜ì˜ ê°ì²´ë“¤ì„ 변수로 참조 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다 설치로 ì¼ë°˜ 픽스처를 설치하고 테스트 메소 ì•”ë¬µì  ë“œì—서 ì¸ìŠ¤í„´ìŠ¤ 변수나 í´ëž˜ìФ 변수로 ì ‘ê·¼
  • 23. 애매한 테스트(Obscure Test) ì›ì¸ ì¼ë°˜ 픽스처(General Fixture) 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤ 코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다 코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다 테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤ 여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다 ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다 테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤ 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
  • 24. 애매한 테스트(Obscure Test) ì›ì¸ 관련 없는 ì •ë³´(Irrelevant Information) 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤ 코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다 코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다 테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤ 여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다 ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다 테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤ 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
  • 25. 애매한 테스트(Obscure Test) ì›ì¸ 하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data) 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤ 코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다 코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다 테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤ 여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다 ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다 테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤ 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
  • 26. 애매한 테스트(Obscure Test) ì›ì¸ ê°„ì ‘ 테스팅(Indirect Testing) 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 많다 테스트 ë©”ì†Œë“œì— ì •ë³´ê°€ 너무 ì ë‹¤ 코드를 ê¹”ë”하고 간단하게 유지하려는 ì˜ì§€ê°€ 없다 코드를 '그냥 ì¸ë¼ì¸ìœ¼ë¡œ' 작성한다 테스트가 외부ìžì›ì— ì˜ì¡´í•œë‹¤ 여러 테스트를 ì§€ì›í•˜ëŠ” 픽스처를 쓴다 테스테 ìƒê´€ì—†ëŠ” 리터럴 ê°’ì´ ë„ˆë¬´ 많다 절차형 ìƒíƒœ ê²€ì¦ì„ 쓴다 ìž˜ë¼ ë¶™ì—¬ë„£ê¸°ë¡œ 테스트 로ì§ì„ 재사용한다 테스트ì—서 접근하려는 í´ëž˜ìŠ¤ì˜ SUTë¶€ë¶„ì´ privateì´ë‹¤ 테스트 ìš©ì´ì„±ì„ ìƒê°í•˜ì§€ 않고 설계했다
  • 27. 애매한 테스트(Obscure Test) í•´ê²°ì±… ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다 ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다 픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다 최소 픽스처, 신선한 픽스처 사용 테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다 관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출 설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다 ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤ 복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용 리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다 ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다 SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선 SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
  • 28. 애매한 테스트(Obscure Test) í•´ê²°ì±… 욕심ìŸì´ 테스트(Eager Test) ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다 ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다 픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다 최소 픽스처, 신선한 픽스처 사용 테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다 관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출 설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다 ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤ 복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용 리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다 ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다 SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선 SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
  • 29. 애매한 테스트(Obscure Test) í•´ê²°ì±… 미스터리한 ì†ë‹˜(Mystery Guest) ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다 ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다 픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž íŒŒì¼ ì´ë¦„ì„ ìž˜ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다 최소 픽스처, 신선한 픽스처 사용 테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다 관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출 설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다 ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤ 복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용 리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다 ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다 SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선 SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
  • 30. 애매한 테스트(Obscure Test) í•´ê²°ì±… ì¼ë°˜ 픽스처(General Fixture) ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다 ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다 픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다 최소 픽스처, 신선한 픽스처 사용 테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다 관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출 설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다 ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤ 복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용 리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다 ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다 SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선 SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
  • 31. 애매한 테스트(Obscure Test) í•´ê²°ì±… 관련 없는 ì •ë³´(Irrelevant Information) ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다 ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다 픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다 최소 픽스처, 신선한 픽스처 사용 테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다 관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출 설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다 ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤ 복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용 리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다 ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다 SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선 SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
  • 32. 애매한 테스트(Obscure Test) í•´ê²°ì±… 하드 ì½”ë”©ëœ í…ŒìŠ¤íŠ¸ ë°ì´í„°(Hard-Coded Test Data) ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다 ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다 픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다 최소 픽스처, 신선한 픽스처 사용 테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다 관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출 설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다 ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤ 복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용 리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다 ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다 SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선 SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
  • 33. 애매한 테스트(Obscure Test) í•´ê²°ì±… ê°„ì ‘ 테스팅(Indirect Testing) ë” ì¢‹ì€ ê²°í•¨ 국소화를 제공하는 ë…립ì ì¸ ë‹¨ì¼ ì¡°ê±´ 테스트 스위트로 만든다 ì¸ë¼ì¸ 설치로 신선한 픽스처를 쓴다 픽스처 ì•ˆì˜ ê°ì²´ë“¤ì— 찾기메소드로 접근하는 ê²ƒì„ ê³ ë ¤í•´ë³´ìž íŒŒì¼ ì´ë¦„ì„ ì ë‹¹ížˆ 붙여 ì•ˆì— ì–´ë–¤ ë°ì´í„°ê°€ 들어있는지 ì§ìž‘í•  수 있게 해준다 최소 픽스처, 신선한 픽스처 사용 테스트별로 ê°€ìƒì˜ ë°ì´í„°ë² ì´ìФ 샌드박스를 만든다 관련 있는 ì •ë³´ë§Œ ì¸ìžë¡œ 받는 ì¸ìžë¥¼ 받는 ìƒì„± 메소드 호출 설치부와 ê²€ì¦ë¶€ì— 필요한 픽스처 ê°’ì„ ì ë‹¹ížˆ 초기화한 ìƒìˆ˜ë¡œ 바꾼다 ê²°ê³¼ ê²€ì¦ ë¡œì§ì—서 기대 ê°ì²´ë¡œ í•œë²ˆì— ë‹¨ì–¸í•œë‹¤ 복잡한 ì ˆì°¨ì  ê²€ì¦ë¡œì§ì„ 숨기는 맞춤 단언문 사용 리터럴 ìƒìˆ˜ë¥¼ 다른 걸로 바꿔준다 ë³„ê°œì˜ ìƒì„±ê°’ì„ ì¨ì„œ 테스트가 ì‹¤í–‰ë  ë•Œë§ˆë‹¤ 다른 ê°’ì„ ì“°ê²Œ 보장해줘야 한다 SUTì˜ í…ŒìŠ¤íŠ¸ ìš©ì´ì„±ì„ 위한 설계를 개선 SUT를 ê°„ì ‘ì ìœ¼ë¡œ 접근해야만 한다면 SUT API 캡ìŠí™” 사용
  • 34. 15장ì—서 다루는 냄새 애매한 테스트 테스트 ë‚´ 조건문 ë¡œì§ í…ŒìŠ¤íŠ¸í•˜ê¸° 힘든 코드 테스트 코드 중복 제품 코드 ë‚´ 테스트 로ì§
  • 35. 테스트 ë‚´ 조건문 로ì§(Conditional Test Logic) í…ŒìŠ¤íŠ¸ì— ì‹¤í–‰ 안 ë  ìˆ˜ë„ ìžˆëŠ” 코드가 있다 들쑥날쑥한 테스트 코드 완전 ìžë™ 테스트는 다른 ì½”ë“œì˜ ë™ìž‘ì„ ê²€ì¦í•˜ëŠ” 코드다 완전 ìžë™ 테스트 코드가 복잡하다면......? 테스트를 위한 테스트......? 테스트가 í•„ìš”ì—†ì„ ì •ë„로 단순하게 만드는 ê²ƒì´ ì •ë‹µ 테스트 ë‚´ 조건문 로ì§ì€ í•„ìš” ì´ìƒìœ¼ë¡œ 테스트를 복잡하게 만드 는 ìš”ì¸ ì¤‘ 하나다
  • 36. 테스트 ë‚´ 조건문 로ì§(Conditional Test Logic) 유연한 테스트 언제 어디서 실행ë˜ëŠëƒì— ë”°ë¼ ë‹¤ë¥¸ ê¸°ëŠ¥ì„ ê²€ì¦í•˜ëŠ” 테스트 ê²€ì¦ ì¡°ê±´ë¬¸ ë¡œì§ ê¸°ëŒ€ ê²°ê³¼ ê²€ì¦ì— 조건문 사용 테스트 ë‚´ 제품 ë¡œì§ ë³µìž¡í•œ í•´ì²´ 여러 테스트 ì¡°ê±´
  • 37. 테스트 ë‚´ 조건문 로ì§(Conditional Test Logic) ì¦ìƒ : 테스트 코드 ë‚´ì— ë°˜ë³µë¬¸ì´ë‚˜ ì¡°ê±´ë¬¸ì´ ìžˆë‹¤ 테스트가 ìƒí™©ì— ë”°ë¼ ë‹¤ë¥¸ ì¼ì„ í•  수 있게 조건문 로ì§ì´ 들어 있다 í…ŒìŠ¤íŠ¸ì˜ ê²°ê³¼ ê²€ì¦ë¶€ì— 조건문 로ì§ì´ 들어있다 픽스처 í•´ì²´ 코드가 복잡하다 여러 입력값과 ê·¸ 기대 ê²°ê³¼ê°’ì— ê°™ì€ í…ŒìŠ¤íŠ¸ ë¡œì§ ì ìš©
  • 38. 테스트 ë‚´ 조건문 로ì§(Conditional Test Logic) 미치는 ì˜í–¥ 테스트 코드ì—서 ë¬´ì—‡ì„ í•˜ëŠ”ì§€ 알기 어렵다 테스트가 ê²°ì •ë¡ ì ì´ì§€ 않아 디버깅하기 어렵다 어려운 ìž‘ì—…ì— ëŒ€í•´ 테스트를 정확하게 작성하기 어렵다 테스트가 ì´í•´í•˜ê¸° 어려워 유지보수가 힘들다 모든 제어경로가 테스트 ë˜ì—ˆëŠ”ì§€ 알 수 없다
  • 39. 테스트 ë‚´ 조건문 로ì§(Conditional Test Logic) ì›ì¸ SUTê°€ 올바른 ë°ì´í„°ë¥¼ 반환하지 ì•Šì•˜ì„ ë•Œì˜ if문 처리 여러 ê°ì œë¥¼ í•œêº¼ë²ˆì— ê²€ì¦í•˜ê¸° 위해 반복문 사용 복잡한 ê°ì²´ë‚˜ 다형성 ë°ì´í„° 구조를 ê²€ì¦ í…ŒìŠ¤íŠ¸ 픽스처나 기대 ê°ì²´ 초기화시 í•˜ë‚˜ì˜ í…ŒìŠ¤íŠ¸ì—서 여러 다른 경우 ê²€ì¦ ì¡´ìž¬í•˜ì§€ 않는 픽스처 ê°ì²´ë¥¼ 해체하지 않기 위해 if문 사용 í™˜ê²½ì— ëŒ€í•œ 제어능력 부족 가비지 컬렉션 ì‹œìŠ¤í…œì´ í•´ê²°í•´ 줄 수 없는 ì§€ì†ì ì¸ ìžì›ì„ ë§Žì´ ì‚¬ìš©
  • 40. 테스트 ë‚´ 조건문 로ì§(Conditional Test Logic) í•´ê²°ì±… SUTì—서 '바꿀 수 있는 ì˜ì¡´'ì„ ì§€ì›í•˜ê²Œ 리팩토ë§í•œë‹¤ 보호 단언문 사용 복잡한 ê°ì²´ë¥¼ ê²€ì¦í•  때는 기대ê°ì²´ì— ë™ë“± 단언문 사용 테스트용 ë™ë“±ì„ ì •ì˜í•œ 맞춤 단언문 사용 테스트 유틸리티 메소드나 공통 ì¸ìžë¥¼ 받는 테스트 사용 ìž…ë ¥ëœ ê°’ì— ëŒ€í•œ ê³„ì‚°ëœ ê°’ì„ ì“´ë‹¤ ì•”ë¬µì  í•´ì²´, ìžë™ í•´ì²´ 사용 신선한 픽스처, 테스트 ëŒ€ì—­ì„ ì‚¬ìš©í•´ ì§€ì†ë˜ëŠ” ê°ì²´ë¥¼ ì“°ì§€ 않는다
  • 41. 15장ì—서 다루는 냄새 애매한 테스트 테스트 ë‚´ 조건문 ë¡œì§ í…ŒìŠ¤íŠ¸í•˜ê¸° 힘든 코드 테스트 코드 중복 제품 코드 ë‚´ 테스트 로ì§
  • 42. 테스트하기 힘든 코드(Hard-to-Test Code) 코드가 테스트 하기 어렵다 강하게 ê²°í•©ëœ ì½”ë“œ 비ë™ê¸° 코드 테스트할 수 없는 테스트 코드
  • 43. 테스트하기 힘든 코드(Hard-to-Test Code) ì¦ìƒ ì›ëž˜ë¶€í„° 테스트 하기 힘든 코드 여러 다른 í´ëž˜ìŠ¤ì™€ 함께 테스트 해야만 하는 코드 ì§ì ‘ 메소드 호출로 테스트할 수 없는 í´ëž˜ìФ 테스트 ë©”ì†Œë“œì˜ ë‚´ìš©ì´ ë³µìž¡í•˜ë‹¤ 테스트가 올바른지 확신할 수 없다
  • 44. 테스트하기 힘든 코드(Hard-to-Test Code) 미치는 ì˜í–¥ ì½”ë“œì˜ í’ˆì§ˆì„ ì‰½ê²Œ ê²€ì¦í•  수 없다 테스트 ë¬¸ì„œí™”ì— í° ê³µì„ ë“¤ì´ì§€ 않으면 품질 í‰ê°€ë¥¼ 반복하기 어렵다 단위 테스트가 어렵다 테스트가 복잡하고 ì‹¤í–‰ì´ ëŠë ¤ì§„다 ë²„ê·¸íˆ¬ì„±ì´ í…ŒìŠ¤íŠ¸ê°€ ë˜ê¸° 쉽다 테스트 유지 ë¹„ìš©ì´ ë¹„ì‹¸ë‹¤ 테스트를 제대로 작성하기 어렵다
  • 45. 테스트하기 힘든 코드(Hard-to-Test Code) ì›ì¸ 설계가 조잡하다 ê°ì²´ì§€í–¥ ì„¤ê³„ê²½í—˜ì´ ë¶€ì¡±í•˜ë‹¤ 액티브 ê°ì²´ì™€ 강하게 ê²°í•©ë˜ì–´ 있다 ë°ìŠ¤íŠ¸ì½”ë“œëŠ” ì›ëž˜ 테스트하기 어렵다
  • 46. 테스트하기 힘든 코드(Hard-to-Test Code) í•´ê²°ì±… ê²°í•©ì„ ë¶„ë¦¬í•œë‹¤ : 테스트 대역, 테스트 스í…, ëª¨ì˜ ê°ì²´ '레거시 코드 활용 ì „ëžµ'ì„ ì½ì–´ë³¸ë‹¤ 로ì§ê³¼ 비ë™ê¸° ì ‘ê·¼ 매커니즘 분리 : 대강 만든 ê°ì²´ 테스트 메소드들 아주 단순하게 만든다
  • 47. 15장ì—서 다루는 냄새 애매한 테스트 테스트 ë‚´ 조건문 ë¡œì§ í…ŒìŠ¤íŠ¸í•˜ê¸° 힘든 코드 테스트 코드 중복 제품 코드 ë‚´ 테스트 로ì§
  • 48. 테스트 코드 중복(Test Code Duplication) 여러 번 반복ë˜ëŠ” 테스트 코드 ê°™ì€ ì£¼ì œì— ëŒ€í•´ 약간씩 다른 시나리오로 테스트 해야 하는 경우 'ìž˜ë¼ ë¶™ì—¬ë„£ê¸°' 코드 재사용 바퀴 재발명 하기
  • 49. 테스트 코드 중복(Test Code Duplication) ì¦ìƒ ê°™ì€ ì½”ë“œê°€ 여러 테스트ì—서 반복ëœë‹¤ 한 테스트 안ì—서 비슷한 êµ¬ë¬¸ì´ ë°˜ë³µëœë‹¤ 미치는 ì˜í–¥ SUT메소드 ì˜ë¯¸ê°€ 변경ë˜ë©´ 모든 ë³µì‚¬ë³¸ì— ìœ ì§€ë³´ìˆ˜ 해야한다 테스트 유지 ë¹„ìš©ì´ ëŠ˜ì–´ë‚œë‹¤
  • 50. 테스트 코드 중복(Test Code Duplication) ì›ì¸ ë¦¬íŒ©í† ë§ ê¸°ìˆ ì´ë‚˜ ê²½í—˜ì´ ë¶€ì¡± ì¼ì •ì— ëŒ€í•œ ì••ë°• ì–´ë–¤ 테스트 유틸리티 메소드가 있는지 모른다 í•´ê²°ì±… 메소트 뽑아내기 ìƒì„± 메소드, 찾기 메소드 맞춤 단언문, ê²€ì¦ ë©”ì†Œë“œ 'ì¸ìž ë„ìž…' ë¦¬íŒ©í† ë§ í…ŒìŠ¤íŠ¸ 유틸리티 메소드 확ì¸
  • 51. 15장ì—서 다루는 냄새 애매한 테스트 테스트 ë‚´ 조건문 ë¡œì§ í…ŒìŠ¤íŠ¸í•˜ê¸° 힘든 코드 테스트 코드 중복 제품 코드 ë‚´ 테스트 로ì§
  • 52. 제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production) 제품 ì½”ë“œì— í…ŒìŠ¤íŠ¸ì—서만 실행ë¼ì•¼ 하는 코드가 들어있다 테스트 í›… 테스트 ì „ìš© 제품 코드 ë‚´ 테스트 ì˜ì¡´ ë™ë“± 오염
  • 53. 제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production) ì¦ìƒ 순전히 테스트ì—서만 필요한 로ì§ì´ SUTì•ˆì— ë“¤ì–´ 있다 SUTê°€ 테스트 중ì¼ë•Œ 다르게 실행ë˜ëŠ” 로ì§ì´ 있다 SUTì¼ë¶€ 메소드가 테스트ì—서만 ì“°ì´ê³  있다 실제 private ì´ì–´ì•¼ 하는 ì†ì„±ì´ public 으로 ë¼ ìžˆë‹¤ 제품 코드만 빌드할 수가 없다 테스트 ì‹¤í–‰ì´ ì—†ëŠ” 경우 제품 코드를 실행할 수 없다 테스트ì—ì„œì˜ í•„ìš”ë¡œ equals 메소드를 변경 SUTì—서 equals ì˜ ì •ì˜ë¥¼ 변경
  • 54. 제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production) 미치는 ì˜í–¥ 제품 ìƒíƒœì—서 테스트 코드가 실행ë˜ë©´ 심ê°í•œ 문제가 ìƒê¸¸ 수 있다 SUT를 ë” ë³µìž¡í•˜ê²Œ 만든다 ì œí’ˆì˜ ì‹¤í–‰ í¬ê¸°ê°€ 늘어난다 제품ì—서 뜻하지 않게 테스트 코드가 ì‹¤í–‰ë  ìˆ˜ 있다 새로운 ìš”êµ¬ì‚¬í•­ì„ ì§€ì›í•˜ëŠ” equals 로ì§ì„ 추가하기 어렵다 ì›ì¸ 알려진 ê°’ì„ ë¦¬í„´í•´ SUTë™ìž‘ì„ ê²°ì •ì ìœ¼ë¡œ 만든다 í…ŒìŠ¤íŠ¸ì— í•„ìš”í•œ 정보를 í´ëž˜ìŠ¤ë¡œë¶€í„° 노출 í…ŒìŠ¤íŠ¸ì— í•„ìš”í•œ ì •ë³´ ì´ˆê¸°í™”ì— ë” ë§Žì€ ì œì–´ë¥¼ 하기 위한 메소드 추가 모듈간 ì˜ì¡´ì„±ì— ì‹ ê²½ì„ ì“°ì§€ 않는다 테스트용 ë™ë“±ì˜ ê°œë…ì„ ìž˜ 모른다
  • 55. 제품 코드 ë‚´ 테스트 로ì§(Test Logic In Production) í•´ê²°ì±… 바꿀 수 있는 ì˜ì¡´ 사용 : 스트레티지 패턴 테스트용 하위í´ëž˜ìŠ¤ë¥¼ 만들어 SUTì˜ íŠ¹ì • 메소드를 오버ë¼ì´ë”©í•œë‹¤ 테스트 ì „ìš©ìž„ì„ ë¶„ëª…í•˜ê²Œ 네ì´ë°ì„ 한다 ì˜ì¡´ê´€ê³„를 신중히 관리한다 equals 수정 대신 맞춤 단언문으로 내장 ë™ë“± ë‹¨ì–¸ë¬¸ì„ ì“°ê²Œ 한다 ë™ì  ëª¨ì˜ ê°ì²´ ìƒì„± ë„구를 쓴다면 비êµìžë¥¼ 쓴다 기대 ê°ì²´ì˜ 테스트용 하위 í´ëž˜ìŠ¤ì— equals 메소드를 구현한다
  • 56. ë