29. public void testInvoice_addLineItem8() { LineItem expItem = new LineItem(inv, product, QUANTITY); // 실행 inv.addItemQuantity(product, QUANTITY); // 검증 List lineItems = inv.getLineItems(); LineItem actual = (LineItem)lineItems.get(0); assertLineItemsEqual ("Item", expItem, actual); }
30. 맞춤 단언문을 만드는 요령 먼저 비어있는 단언 메소드를 호출하게 테스트 작성후 맞춤 단언문이 파악되면 적당한 로직을 채운다
31. 맞춤 단언문의 장점 결과 검증 절차를 알기 쉬운 이름으로 숨긴다. 의도가 눈에 잘 들어온다. 단언문 로직도 맞춤 단언문 테스트를 작성해 단위 테스트 할 수 있다. 맞춤 단언문이 필요할때 모든 필드를 비교하고 싶지 않을때 동등 대신 동일만 비교하고 싶을때 테스트용 동등을 원할때 생성자가 없어 기대 객체의 인스턴스를 생성할 수 없을때
32. 코드 중복을 줄이는 방법 기대 객체 사용 맞춤 단언문 사용 결과를 설명하는 검증 메소드 사용 인자를 받는 테스트 데이터 주도 테스트
33. void assertInvoiceContainsOnlyThisLineItem(Invoice inv, LineItem expItem) { List lineItems = inv.getLineItems(); assertEquals("number of items", lineItems.size(), 1); LineItem actual = (LineItem)lineItems.get(0); assertLineItemsEqual("", expItem, actual); }
34. 검증 메소드와 맞춤 단언문 차이 맞춤 단언문은 단언만 하는 데 반해 검증 메소드는 SUT와 상호작용도 한다. 맞춤 단언문의 시그니처는 일반적인 동등 단언문 시그니처 검증 메소드에서는 SUT에 넘겨줄 추가 인자가 필요해서 형태가 자유롭다. 본질적으로 검증 메소드는 맞춤 단언문과 인자를 받는 테스트의 중간 형태
35. 코드 중복을 줄이는 방법 기대 객체 사용 맞춤 단언문 사용 결과를 설명하는 검증 메소드 사용 인자를 받는 테스트 데이터 주도 테스트
36. 픽스처 설치 로직이 똑같고 데이터만 다를 경우 공통의 픽스처 설치, SUT 실행 , 결과 검증 부분만을 뽑아서 만든다. 픽스처 설치, SUT 실행, 기대 결과에 필요한 데이터가 포함돼 있다.
38. 코드 중복을 줄이는 방법 기대 객체 사용 맞춤 단언문 사용 결과를 설명하는 검증 메소드 사용 인자를 받는 테스트 데이터 주도 테스트
39. 데이터 주도 테스트 테스트 케이스는 일반적이며 프레임워크가 직접 실행할 수 있다. 실행될 때는 테스트 데이터 파일에서 인자를 읽어온다. 인자를 받는 테스트는 테스트용 데이터를 테스트 메소드에서 받는 반면에 데이터 주도 테스트는 자체가 테스트 메소드이고 파일에서 테스트용 데이터를 직접 읽어 들인다.
40. Data File ID, Action, SourceXml, ExpectedHtml Extref,crossref,<extref id='abc'/>,<a href='abc.html'>abc</a> TTerm,crossref,<testterm id='abc'/>,<a href='abc.html'>abc</a> TTerms,crossref,<testterms id='abc'/>,<a href='abc.html'>abcs</a> def executeDataDrivenTest filename dataFile = File.open(filename) dataFile.each_line do | line | desc, action, part2 = line.split(",") sourceXml, expectedHtml, leftOver = part2.split(",") if "crossref"==action.strip generateAndVerifyHtml sourceXml, expectedHtml, desc else # 새 '동사'들은 위에 elseif 형태로 추가할 수 있다. report_error("unknown action" + action.strip) end end end
41. 10장에서 이야기 하는 것 테스트 결과 검증 방법 상태 검증 동작 검증 테스트 코드 작성 노하우 테스트 코드 중복 줄이기 테스트 내 조건문 로직 피하기 이해하기 쉬운 테스트를 작성하기
42. 테스트 내에 조건문이 있으면 같은 테스트가 상황에 따라 다르게 실행될 수 있다는 점에서 나쁘다. 신뢰가 떨어진다.
43. 조건문을 넣는 이유 테스트 도중 이미 잘못된 부분을 찾았다면 나머지 단언문은 실행해봐야 별 도움이 안 되니까 아예 실행하고 싶지 않다. 코드가 읽기 어려워진다. 기대 결과 값과 비교하는 실제 결과에 대해 다양한 상황을 허용해야 한다. 코드가 읽기 어려워진다. 하나의 테스트 메소드를 여러 상황에서 재사용하고 싶다. 절대 하지마
44. if문 제거하기 보호 단언문을 쓴다.테스트 내 조건문 로직이 없어도 테스트 에러를 낼 수 있는 곳에 단언문이 걸리게 할 수 있다.
45. List lineItems = invoice.getLineItems(); if (lineItems.size() == 1) { LineItem expected = new LineItem(invoice, product, 5, new BigDecimal("30"), new BigDecimal("69.96")); LineItem actItem = (LineItem) lineItems.get(0); assertEquals("invoice", expected, actItem); } else { fail("invoice should have exactly one line item"); }
46. List lineItems = invoice.getLineItems(); assertEquals("number of items", lineItems.size(), 1); LineItem expected = new LineItem(invoice, product, 5, new BigDecimal("30"), new BigDecimal("69.96")); LineItem actItem = (LineItem) lineItems.get(0); assertEquals("invoice", expected, actItem);
47. 반복문 제거하기 테스트 메소드에 반복문이 들어가면 다음과 같은 문제가 생긴다. 테스트할 수 없는 테스트 코드가 추가되는 셈이 된다. 애매한 테스트가 되기 쉽다. 복잡하다. 테스트를 안쓰게 된다. 해결법 테스트 유틸리티 메소드에 로직을 옮겨놓고 의도가 잘 드러나게 이름을 정하면 된다.
48. 10장에서 이야기 하는 것 테스트 결과 검증 방법 상태 검증 동작 검증 테스트 코드 작성 노하우 테스트 코드 중복 줄이기 테스트 내 조건문 로직 피하기 이해하기 쉬운 테스트를 작성하기
49. 이해하기 쉬운 테스트 작성 요령 거꾸로 작업 밖에서 안으로 작업 테스트 주도 개발로 테스트 유틸리티 메소드 작성 재사용 가능한 검증 로직을 둘 위치
50. 이해하기 쉬운 테스트 작성 요령 거꾸로 작업 밖에서 안으로 작업 테스트 주도 개발로 테스트 유틸리티 메소드 작성 재사용 가능한 검증 로직을 둘 위치
51. 함수의 가장 마지막 줄을 먼저 작성해본다. 테스트를 먼저 작성해 본다. 단언문들을 먼저 작성한다. 변수를 먼저 사용하고, 나중에 선언한다.
52. 이해하기 쉬운 테스트 작성 요령 거꾸로 작업 밖에서 안으로 작업 테스트 주도 개발로 테스트 유틸리티 메소드 작성 재사용 가능한 검증 로직을 둘 위치
53. 일정한 추상수준을 유지하는 것을 의미 테스트 유틸리티 메소드를 호출하는 방식으로 코딩을 함으로써 테스트 메소드를 작성하는 동안에는 SUT의 요구 사항에만 집중하게 한다. 어떤 객체나 결과가 필요한지만 작성해둔다. 정의하지 않은 채로 먼저 사용하는 유틸리티 메소드는 테스트 자동 로직이 들어갈 장소 역할을 하게 된다. 테스트 유틸리티 메소드를 나중에 구현한다.
54. 이해하기 쉬운 테스트 작성 요령 거꾸로 작업 밖에서 안으로 작업 테스트 주도 개발로 테스트 유틸리티 메소드 작성 재사용 가능한 검증 로직을 둘 위치
55. 테스트 유틸리티 메소드를 구현할 시점 테스트 유틸리티 메소드를 사용하는 테스트 메소드 작성이 끝났을때 테스트 유틸리티 메소드를 작성할때 테스트 유틸리티용 테스트를 작성한다.
56. 이해하기 쉬운 테스트 작성 요령 거꾸로 작업 밖에서 안으로 작업 테스트 주도 개발로 테스트 유틸리티 메소드 작성 재사용 가능한 검증 로직을 둘 위치
57. 재사용 가능한 테스트 로직은 어디에 둬야 할까? 테스트 케이스 클래스 안 테스트케이스 상위클래스 테스트 도우미 안