TDD&Refactoring Day 03: TDD

971 views
823 views

Published on

Published in: Technology, Education
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
971
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
1
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

TDD&Refactoring Day 03: TDD

  1. 1. Day03 실습으로
  2. 2.  배우는
  3. 3.   테스트
  4. 4.  주도
  5. 5.  개발
  6. 6.   1  
  7. 7. 학습목표u  본 교육과정은 실습을 통해 TDD를 배워보는 과정입니다.u  TDD 그 자체가 목적이 아니며, 효율적인 프로그래밍을 위한 과정의 하 나로, 올바른 개발 스타일을 몸에 익히는 것이 이번 교육의 목적입니다. 2   디자인패턴
  8. 8. Learning concept-  Wisdom over Knowledge-  Practice over Seeing-  I don’t know what I don’t know-  options and guide for good TDD 3
  9. 9. 과정 진행 키워드: 3C Consideration Communication Cooperation 4
  10. 10. 첫째 시간기초점검 5
  11. 11. 환경설정 및 기본코드 작성   개발 환경을 확인합니다.   간단한 코드를 작성해 봅니다. 6
  12. 12. 두 번째 시간TDD접근방식A way of approach to the TDD
  13. 13. TDD 작성 기본 원칙지금 작성하려고 하는 코드에서 테스트를 작성 할 수 있는 가장 간단한 것은? 끊임 없는 질문과 접근사고의 변화가 필요
  14. 14. TDD의 특성을 이해한다. - 테스트를 통해 드러나는 유익한 특성 중 하나는 응집력이 높은 메소드이다. 테스트에서 적당한 반복은 허용해야 한다 - 개발자가 새로운 기능을 개발하기 위한 최초의 테스트를 작성할 때 성공보다는 실패할 테스트를 작성한다.  - TDD 버전이 업무코드 작성한 다음에 테스트 코드를 작성하는 것 보다 3배 이상 간결하다. 
  15. 15. TDD를 하면 설계를 하지 않아도 된다? 10
  16. 16. 안 좋은 디자인의 징후-  단위 테스트 케이스 작성이 어렵다-  단위 테스트 케이스가 자주 깨진다.-  단위 테스트 케이스 실행을 위한 준비해야 할 것이 많다.-  다른 사람의 테스트 케이스를 읽기가 어렵다. 11
  17. 17. 효율적인TDD접근접근방식 12
  18. 18. 프레임워크를 적용하지 않고 개발해 본다. 13
  19. 19. public
  20. 20.  class
  21. 21.  Calculator
  22. 22.  {
  23. 23.  
  24. 24.  
  25. 25.  public
  26. 26.  int
  27. 27.  sum(int
  28. 28.  a,
  29. 29.  int
  30. 30.  b)
  31. 31.  {
  32. 32.  
  33. 33.  
  34. 34.  
  35. 35.  
  36. 36.  return
  37. 37.  0;
  38. 38.  
  39. 39.  
  40. 40.  }
  41. 41.  
  42. 42.  
  43. 43.  
  44. 44.  public
  45. 45.  static
  46. 46.  void
  47. 47.  main(String[]
  48. 48.  args)
  49. 49.  {
  50. 50.  
  51. 51.  
  52. 52.  
  53. 53.  
  54. 54.  
  55. 55.  
  56. 56.  Calculator
  57. 57.  calc
  58. 58.  =
  59. 59.  new
  60. 60.  Calculator();
  61. 61.  
  62. 62.  
  63. 63.  
  64. 64.  
  65. 65.  
  66. 66.  
  67. 67.  System.out.println(
  68. 68.  calc.sum(10,
  69. 69.  20)
  70. 70.  ==
  71. 71.  30
  72. 72.  );
  73. 73.  
  74. 74.  
  75. 75.  
  76. 76.  
  77. 77.  
  78. 78.  
  79. 79.  System.out.println(
  80. 80.  calc.sum(1,
  81. 81.  2)
  82. 82.  ==
  83. 83.  3
  84. 84.  );
  85. 85.  
  86. 86.  
  87. 87.  
  88. 88.  
  89. 89.  
  90. 90.  
  91. 91.  System.out.println(
  92. 92.  calc.sum(-10,
  93. 93.  20)
  94. 94.  ==
  95. 95.  10
  96. 96.  );
  97. 97.  
  98. 98.  
  99. 99.  
  100. 100.  
  101. 101.  
  102. 102.  
  103. 103.  System.out.println(
  104. 104.  calc.sum(0,
  105. 105.  0)
  106. 106.  ==
  107. 107.  0
  108. 108.  );
  109. 109.  
  110. 110.  
  111. 111.  }
  112. 112.  }
  113. 113.   모두 true면 작성완료! -----실행 결과----- false false Comment false s true 굳이 프레임워크를 쓰지 않아도 무방합니다. 업무로직 작성 전에 완성상태를 검증해 줄 수 있는 코드가 존재하기만 하면 충분합니다. 14
  114. 114. 테스트 케이스에 assert문을 한 번만 쓴다.안될 것 같으면 케이스를 분리한다. @Test public void testGetClosestToZero_ () { int [] source = new int[]{ 2, 3, 4, 1 }; assertEquals(1, closerToZero.getClosestToZero(source)); } @Test public void testGetClosestToBig() { int [] source = new int[]{ -6, -2, -3, -4 }; assertEquals(-2, closerToZero.getClosestToZero(source)); } 15
  115. 115. 테스트 케이스에 assert문을 한 번만 쓴다.단, 동일 문맥일 경우에는 예외로 한다.@Testpublic void testGetClosestToZero_ () { Customer vip = getCustomer(); assertNotNull(vip); assertEquals(VIP.DISCOUNT_RATE vip.getDiscountRate());} 16
  116. 116. 프로젝트 전체를 TDD로 개발하려 하지않는다. 17
  117. 117. 한글을 적극적으로 사용한다. @Test public void testGetClosestToZero_모두양수() { int [] source = new int[]{ 2, 3, 4, 1 }; assertEquals(1, closerToZero.getClosestToZero(source)); } @Test public void testGetClosestToZero_모두음수() { int [] source = new int[]{ -6, -2, -3, -4 }; assertEquals(-2, closerToZero.getClosestToZero(source)); } 18
  118. 118. 메소드 이름을 test로 시작할 필요가 없다.방법.1 한글로 작성 @Test
  119. 119.   public
  120. 120.  void
  121. 121.  30분이내에_환승_가능해야함
  122. 122.  {
  123. 123.   …⋯
  124. 124.   }
  125. 125.  방법.1 Should로 시작 @Test
  126. 126.   public
  127. 127.  void
  128. 128.  shouldAcceptLogin
  129. 129.  {
  130. 130.   …⋯
  131. 131.   }
  132. 132.   19
  133. 133. 행위 기반 테스트는 가급적 만들지 않는다.@Test
  134. 134.  public
  135. 135.  void
  136. 136.  testGetOrderPrice
  137. 137.  ()
  138. 138.  throws
  139. 139.  Exception
  140. 140.  {
  141. 141.  
  142. 142.  
  143. 143.  
  144. 144.  
  145. 145.  PriceCalculator
  146. 146.  calculator
  147. 147.  =
  148. 148.  new
  149. 149.  PriceCalculator();
  150. 150.  
  151. 151.  
  152. 152.  
  153. 153.  
  154. 154.  Item
  155. 155.  item
  156. 156.  =
  157. 157.  new
  158. 158.  Item(LightSavor,Kitchen
  159. 159.  knife,100000);
  160. 160.  
  161. 161.  
  162. 162.  
  163. 163.  
  164. 164.  ICoupon
  165. 165.  coupon
  166. 166.  =
  167. 167.  new
  168. 168.  Coupon();
  169. 169.  
  170. 170.  
  171. 171.  
  172. 172.  
  173. 173.  assertEquals(93000,
  174. 174.  calculator.getOrderPrice(item,
  175. 175.  coupon));
  176. 176.  
  177. 177.  
  178. 178.  
  179. 179.  
  180. 180.  int
  181. 181.  methodCallCount
  182. 182.  =
  183. 183.  ((Coupon)coupon).getIsAppliableCallCount();
  184. 184.  
  185. 185.  
  186. 186.  
  187. 187.  assertEquals
  188. 188.  (1,
  189. 189.  methodCallCount);
  190. 190.  }
  191. 191.   20
  192. 192. 행위기반 테스트 Case.1 입력A methodA
  193. 193.   methodB
  194. 194.   doSomething
  195. 195.   rampOn
  196. 196.   Case.2 입력B methodA
  197. 197.   methodB
  198. 198.   call doSomething
  199. 199.   rampOn
  200. 200.   21
  201. 201. Function과 Feature를 혼동하지 않는다. @Test
  202. 202.   public
  203. 203.  void
  204. 204.  30분이내에_환승_가능해야함
  205. 205.  {
  206. 206.   …⋯
  207. 207.   }
  208. 208.   @Test
  209. 209.   public
  210. 210.  void
  211. 211.  testGetSplitedString
  212. 212.  {
  213. 213.   …⋯
  214. 214.   }
  215. 215.   22
  216. 216. 테스트 자동화와 TDD는 목적이 다르다. 23
  217. 217. 습관으로 만들어야 한다.부제: 포기하면 편하다.
  218. 218. 우선, UI 는 고려하지 않는다.
  219. 219. 의존성을 갖는 것들은 최대한 분리시킨다. 26
  220. 220. 절대 Mock을 과용/과신하지 않는다. 27
  221. 221. OO 설계 기법들을 학습한다. 28
  222. 222. 나는 네가 지난 여름에 짠 코드를 알고 있다코드리뷰Code Reviews
  223. 223. 여기 이 괄호하고 세 미콜론들이 Tom의 코드를 완전히 엉망 으로 만들고 있네요Sally는 코드리뷰를 할 때 누굴 부르면 안되는 지에 대한 중요한 교훈을 하나 배웠다.
  224. 224. 코드 리뷰소스는 당신 것이 아니다(Focus Naming!) public
  225. 225.  class
  226. 226.  Customer
  227. 227.  {  
  228. 228.  private
  229. 229.  String
  230. 230.  msName;
  231. 231.  public
  232. 232.  void
  233. 233.  setName(String
  234. 234.  psName)
  235. 235.  {
  236. 236.  
  237. 237.  this.msName
  238. 238.  =
  239. 239.  psName;
  240. 240.  } …
  241. 241. 코드 리뷰소스는 당신 것이 아니다(What is the mean?)…
  242. 242.  final
  243. 243.  int
  244. 244.  DISCOUNT_CONDITION
  245. 245.  =
  246. 246.  2;  
  247. 247.  @Override
  248. 248.  public
  249. 249.  int
  250. 250.  getDiscountCondition()
  251. 251.  {
  252. 252.  
  253. 253.  return
  254. 254.  DISCOUNT_CONDITION;
  255. 255.  } …
  256. 256. 코드 리뷰소스는 당신 것이 아니다(Think about logic #1) public
  257. 257.  class
  258. 258.  MovieVideo
  259. 259.  extends
  260. 260.  Video
  261. 261.  {  
  262. 262.  @Override
  263. 263.  void
  264. 264.  initialize()
  265. 265.  {
  266. 266.  
  267. 267.  
  268. 268.  
  269. 269.  if
  270. 270.  (period
  271. 271.  =
  272. 272.  3)
  273. 273.  {
  274. 274.  
  275. 275.  
  276. 276.  price
  277. 277.  =
  278. 278.  ((price
  279. 279.  /
  280. 280.  2)
  281. 281.  /
  282. 282.  100)
  283. 283.  *
  284. 284.  100;
  285. 285.  
  286. 286.  }
  287. 287.  }
  288. 288.   …⋯
  289. 289. 코드 리뷰소스는 당신 것이 아니다(Think about logic #2)@Override public
  290. 290.  int
  291. 291.  calcRentalFee(int
  292. 292.  rentalPeriod)
  293. 293.  { int
  294. 294.  rentalFeeTotal
  295. 295.  =
  296. 296.  0;
  297. 297.  
  298. 298.  
  299. 299.  
  300. 300.  if
  301. 301.  (rentalPeriod
  302. 302.  =
  303. 303.  discountPeriod)
  304. 304.  { rentalFeeTotal
  305. 305.  =
  306. 306.  (int)
  307. 307.  this.defaultRentalFee
  308. 308.  *
  309. 309.  rentalPeriod;
  310. 310.  
  311. 311.  
  312. 312.  
  313. 313.  }
  314. 314.  else
  315. 315.  { rentalFeeTotal
  316. 316.  =
  317. 317.  (int)
  318. 318.  this.defaultRentalFee
  319. 319.  *
  320. 320.  discountPeriod; rentalFeeTotal
  321. 321.  +=
  322. 322.  this.defaultRentalFee
  323. 323.  *
  324. 324.  discountPercentage
  325. 325.  
  326. 326.  
  327. 327.  
  328. 328.  
  329. 329.  
  330. 330.  
  331. 331.  
  332. 332.  
  333. 333.  
  334. 334.  
  335. 335.  
  336. 336.  
  337. 337.  
  338. 338.  
  339. 339.  *
  340. 340.  (rentalPeriod
  341. 341.  -
  342. 342.  discountPeriod);
  343. 343.  
  344. 344.  
  345. 345.  
  346. 346.  }
  347. 347.  
  348. 348.  
  349. 349.  
  350. 350.  return
  351. 351.  rentalFeeTotal; }
  352. 352. 코드 리뷰소스는 당신 것이 아니다(Think about logic #3)@Override public
  353. 353.  int
  354. 354.  getCharge()
  355. 355.  {
  356. 356.  int
  357. 357.  result
  358. 358.  =
  359. 359.  0;
  360. 360.  if
  361. 361.  (rentalPeriod
  362. 362.  
  363. 363.  2)
  364. 364.  {
  365. 365.  
  366. 366.  result
  367. 367.  =
  368. 368.  (defaultCharge
  369. 369.  *
  370. 370.  2)
  371. 371.  
  372. 372.  
  373. 373.  
  374. 374.  +
  375. 375.  (rentalPeriod
  376. 376.  -
  377. 377.  2)
  378. 378.  *
  379. 379.  (defaultCharge
  380. 380.  /
  381. 381.  2);
  382. 382.  }
  383. 383.  else
  384. 384.  {
  385. 385.  
  386. 386.  result
  387. 387.  =
  388. 388.  defaultCharge
  389. 389.  *
  390. 390.  rentalPeriod;
  391. 391.  }
  392. 392.  return
  393. 393.  result; }
  394. 394. 코드 리뷰소스는 당신 것이 아니다(Think about logic #4) public
  395. 395.  int
  396. 396.  getPoint(Customer
  397. 397.  customer)
  398. 398.  { for
  399. 399.  (int
  400. 400.  i
  401. 401.  =
  402. 402.  0;
  403. 403.  i
  404. 404.  
  405. 405.  customers.size();
  406. 406.  i++)
  407. 407.  {
  408. 408.  Customer
  409. 409.  c
  410. 410.  =
  411. 411.  customers.get(i);
  412. 412.  if
  413. 413.  (customer.equals(c))
  414. 414.  {
  415. 415.  
  416. 416.  return
  417. 417.  c.getPoint();
  418. 418.  }
  419. 419.  
  420. 420.  
  421. 421.  
  422. 422.  }
  423. 423.  
  424. 424.  
  425. 425.  
  426. 426.  return
  427. 427.  NO_DATA; }
  428. 428. 코드 리뷰소스는 당신 것이 아니다(이이서) public
  429. 429.  int
  430. 430.  getPoint(Customer
  431. 431.  customer)
  432. 432.  {
  433. 433.  if(
  434. 434.  isRegisteredCustomer(customer)
  435. 435.  ){
  436. 436.  
  437. 437.  return
  438. 438.  findCustomer(customer).getPoint();
  439. 439.  }
  440. 440.  else
  441. 441.  {
  442. 442.  
  443. 443.  return
  444. 444.  NO_DATA;
  445. 445.  } }
  446. 446. 코드 리뷰무엇을 테스트하는 것인지 알 수 있어야 한다 @Test public
  447. 447.  void
  448. 448.  testMovieVideo()
  449. 449.  {
  450. 450.  
  451. 451.  
  452. 452.  Video
  453. 453.  matrix
  454. 454.  =
  455. 455.  new
  456. 456.  MovieVideo(Matrix,
  457. 457.  4,
  458. 458.  1000);
  459. 459.  assertEquals(Matrix,
  460. 460.  matrix.getName());
  461. 461.  assertEquals(500,
  462. 462.  matrix.getPrice()); }   public
  463. 463.  void
  464. 464.  testMovieVideoRound()
  465. 465.  { …⋯
  466. 466. 코드 리뷰Object Null Check 누락 @Test public
  467. 467.  void
  468. 468.  testCustomerName()
  469. 469.  {
  470. 470.  customer
  471. 471.  =
  472. 472.  new
  473. 473.  Customer();
  474. 474.  customer.setName(조영신);
  475. 475.  assertEquals(조영신,
  476. 476.  customer.getName()
  477. 477.  ); }
  478. 478. 코드 리뷰당신이 무엇을 상상하든 그 이상을 하고 있다 public
  479. 479.  boolean
  480. 480.  AddToRentalVideoList(Video
  481. 481.  video)
  482. 482.  {
  483. 483.  RentalVideoList.add(video);
  484. 484.  totalVideoCount++;
  485. 485.  totalFee
  486. 486.  +=
  487. 487.  video.RentalFee;
  488. 488.  return
  489. 489.  true; }
  490. 490. 코드 리뷰벌거숭이 코드(naked code) public
  491. 491.  class
  492. 492.  Video
  493. 493.  {
  494. 494.  
  495. 495.  
  496. 496.  
  497. 497.  public
  498. 498.  enum
  499. 499.  VideoGenre
  500. 500.  {
  501. 501.  Movie,
  502. 502.  Sports,
  503. 503.   Documentary
  504. 504.  } public
  505. 505.  int
  506. 506.  fee
  507. 507.  =
  508. 508.  0; public
  509. 509.  Object
  510. 510.  Genre
  511. 511.  =
  512. 512.  null; public
  513. 513.  String
  514. 514.  videoName;
  515. 515.   public
  516. 516.  int
  517. 517.  RentalFee
  518. 518.  =
  519. 519.  0; public
  520. 520.  int
  521. 521.  RentalPeriod
  522. 522.  =
  523. 523.  0;
  524. 524.   …⋯
  525. 525. 코드 리뷰오래된 미신 (old fashioned myth) @Override public
  526. 526.  String
  527. 527.  toString()
  528. 528.  {
  529. 529.  StringBuilder
  530. 530.  builder
  531. 531.  =
  532. 532.  new
  533. 533.  StringBuilder();
  534. 534.  builder.append(
  535. 535.  );
  536. 536.  builder.append(title);
  537. 537.  builder.append(
  538. 538.  );
  539. 539.  builder.append(fee);
  540. 540.  return
  541. 541.  builder.toString(); }
  542. 542. 코드 리뷰오래된 미신 (이어서) @Override public
  543. 543.  String
  544. 544.  toString()
  545. 545.  {
  546. 546.  return
  547. 547.  
  548. 548.  
  549. 549.  +
  550. 550.  title
  551. 551.  +
  552. 552.  
  553. 553.  
  554. 554.  +
  555. 555.  fee; }
  556. 556. 코드 리뷰임시 변수를 이용한 역할극 public
  557. 557.  void
  558. 558.  testGetVideoInfos()
  559. 559.  {
  560. 560.  
  561. 561.  
  562. 562.  
  563. 563.  String
  564. 564.  inputVideoType
  565. 565.  =
  566. 566.  VideoType.VIDEO_TYPE_MOVIE;
  567. 567.  
  568. 568.  
  569. 569.  
  570. 570.  String
  571. 571.  inputVideoName
  572. 572.  =
  573. 573.  Twilight; int
  574. 574.  inputVideoRentalFee
  575. 575.  =
  576. 576.  2000;  
  577. 577.  
  578. 578.  
  579. 579.  
  580. 580.  Video
  581. 581.  video
  582. 582.  =
  583. 583.  new
  584. 584.  MovieVideo(inputVideoName,
  585. 585.  inputVideoRentalFee);
  586. 586.  
  587. 587.  
  588. 588.  
  589. 589.  String
  590. 590.  outputVideoName
  591. 591.  =
  592. 592.  video.getName();
  593. 593.  
  594. 594.  
  595. 595.  
  596. 596.  String
  597. 597.  outputVideoType
  598. 598.  =
  599. 599.  video.getType(); int
  600. 600.  outputVideoRentalFee
  601. 601.  =
  602. 602.  video.getDefaultRentalFee();   assertEquals(inputVideoName,
  603. 603.  outputVideoName); assertEquals(inputVideoType,
  604. 604.  outputVideoType); assertEquals(inputVideoRentalFee,
  605. 605.  outputVideoRentalFee); }
  606. 606. 코드 리뷰임시 변수를 이용한 역할극 (이어서) public
  607. 607.  void
  608. 608.  testGetVideoInfos()
  609. 609.  {
  610. 610.  
  611. 611.  
  612. 612.  
  613. 613.  Video
  614. 614.  video
  615. 615.  =
  616. 616.  new
  617. 617.  MovieVideo(Twilight”, 2000); assertEquals(Twilight,
  618. 618.  video.getName()); assertEquals(VideoType.VIDEO_TYPE_MOVIE,
  619. 619.  video.getType()); assertEquals(2000,
  620. 620.  video.getDefaultRentalFee()); }
  621. 621. 코드 리뷰테스트 항목과 테스트의 불일치
  622. 622.  @Test
  623. 623.  public
  624. 624.  void
  625. 625.  고객은이름속성이있다()
  626. 626.  {
  627. 627.  
  628. 628.  Customer
  629. 629.  person
  630. 630.  =
  631. 631.  new
  632. 632.  Customer(person);
  633. 633.  
  634. 634.  //person.setName(person);
  635. 635.  
  636. 636.  assertNotNull(person.getName());
  637. 637.  }  
  638. 638.  @Test
  639. 639.  public
  640. 640.  void
  641. 641.  비디오종류는3가지()
  642. 642.  {
  643. 643.  
  644. 644.  new
  645. 645.  Video(movie,
  646. 646.  );
  647. 647.  
  648. 648.  new
  649. 649.  Video(sports,
  650. 650.  );
  651. 651.  
  652. 652.  new
  653. 653.  Video(documentary,
  654. 654.  );
  655. 655.  
  656. 656.  }
  657. 657. 코드 리뷰변경될 내용이 아니라면 아니라고 확실하게 말한다 public
  658. 658.  class
  659. 659.  VideoTest
  660. 660.  {
  661. 661.  
  662. 662.  
  663. 663.  
  664. 664.  Video
  665. 665.  movie;
  666. 666.  
  667. 667.  
  668. 668.  
  669. 669.  Video
  670. 670.  sports;
  671. 671.  
  672. 672.  
  673. 673.  
  674. 674.  Video
  675. 675.  documentary;
  676. 676.  
  677. 677.  
  678. 678.  
  679. 679.  
  680. 680.  @Before
  681. 681.  
  682. 682.  
  683. 683.  
  684. 684.  public
  685. 685.  void
  686. 686.  setUp()
  687. 687.  {
  688. 688.  
  689. 689.  
  690. 690.  
  691. 691.  
  692. 692.  
  693. 693.  
  694. 694.  
  695. 695.  movie
  696. 696.  =
  697. 697.  new
  698. 698.  Movie(300,
  699. 699.  300);
  700. 700.  sports
  701. 701.  =
  702. 702.  new
  703. 703.  Sports(EPL,
  704. 704.  600);
  705. 705.  documentary
  706. 706.  =
  707. 707.  new
  708. 708.  Documentary(그
  709. 709.  섬에
  710. 710.  가고싶다,
  711. 711.  1200); }
  712. 712. 코드 리뷰변경될 내용이 아니라면 아니라고 확실하게 말한다 (이 어서) public
  713. 713.  class
  714. 714.  VideoTest
  715. 715.  {
  716. 716.  final
  717. 717.  Video
  718. 718.  movie
  719. 719.  =
  720. 720.  new
  721. 721.  Movie(300,
  722. 722.  300);;
  723. 723.  
  724. 724.  final
  725. 725.  Video
  726. 726.  sports
  727. 727.  =
  728. 728.  new
  729. 729.  Sports(EPL,
  730. 730.  600);; final
  731. 731.  Video
  732. 732.  documentary
  733. 733.  =
  734. 734.  new
  735. 735.  Documentary(남극의눈물,
  736. 736.  1200);; @Before public
  737. 737.  void
  738. 738.  setUp()
  739. 739.  {
  740. 740.  
  741. 741.  
  742. 742.  …⋯ }
  743. 743.  …⋯
  744. 744. 코드 리뷰만일 코드에 순서가 필요하면 그것도 테스트한다 public
  745. 745.  class
  746. 746.  VideoTest
  747. 747.  {
  748. 748.  MockVideo
  749. 749.  video
  750. 750.  =
  751. 751.  new
  752. 752.  MockVideo(VideoType.MOVIE,
  753. 753.  블랙,
  754. 754.  fee);
  755. 755.  video.setDiscountRule(discountRule);
  756. 756.  video.setStartDiscountDay(startDiscountDay);
  757. 757.  
  758. 758.  
  759. 759.  assertEquals(2500,
  760. 760.  video.getRentalFee(rentalPeriod));
  761. 761.  }
  762. 762. 코드 리뷰레벨 불균형(API vs 모델) public
  763. 763.  void
  764. 764.  getTotlFeeTest
  765. 765.  ()
  766. 766.  {
  767. 767.  
  768. 768.  VideoShop
  769. 769.  shop
  770. 770.  =
  771. 771.  new
  772. 772.  VideoShop();
  773. 773.  Customer
  774. 774.  customer
  775. 775.  =
  776. 776.  getCustomerById(“Johon”);
  777. 777.  List
  778. 778.  rentalList
  779. 779.  =
  780. 780.  customer.getRentals();
  781. 781.  
  782. 782.  
  783. 783.  
  784. 784.  //
  785. 785.  ①
  786. 786.  assertEquals(
  787. 787.  1200,
  788. 788.  shop.getTotalFee(
  789. 789.  rentalList)
  790. 790.  );
  791. 791.  
  792. 792.  
  793. 793.  
  794. 794.  //
  795. 795.  ② }
  796. 796. 코드 리뷰레벨 불균형(API vs 모델) - 모델만들기 class
  797. 797.  Rentals
  798. 798.  {
  799. 799.  private
  800. 800.  List
  801. 801.  list
  802. 802.  =
  803. 803.  new
  804. 804.  ArraryList();
  805. 805.  
  806. 806.  public
  807. 807.  addRental(Rental
  808. 808.  rental){
  809. 809.  
  810. 810.  this.list.add(rental);
  811. 811.  } …⋯
  812. 812.   }
  813. 813.   public
  814. 814.  void
  815. 815.  getTotlFeeTest
  816. 816.  ()
  817. 817.  {
  818. 818.  
  819. 819.  VideoShop
  820. 820.  shop
  821. 821.  =
  822. 822.  new
  823. 823.  VideoShop();
  824. 824.  Customer
  825. 825.  customer
  826. 826.  =
  827. 827.  getCustomerById(“Johon”);
  828. 828.  Rentals
  829. 829.  rentals
  830. 830.  =
  831. 831.  customer.getRentals();
  832. 832.  
  833. 833.  
  834. 834.  
  835. 835.  //①
  836. 836.  assertEquals(
  837. 837.  1200,
  838. 838.  shop.getTotalFee(rentals
  839. 839.  )
  840. 840.  );
  841. 841.  
  842. 842.  
  843. 843.  
  844. 844.  //② }  
  845. 845. 코드 리뷰레벨 불균형(API vs 모델) - Java 5 generics 사용 public
  846. 846.  void
  847. 847.  getTotlFeeTest
  848. 848.  ()
  849. 849.  {
  850. 850.  
  851. 851.  VideoShop
  852. 852.  shop
  853. 853.  =
  854. 854.  new
  855. 855.  VideoShop();
  856. 856.  Customer
  857. 857.  customer
  858. 858.  =
  859. 859.  getCustomerById(“Johon”);
  860. 860.  List
  861. 861.  Rental
  862. 862.  rentalList
  863. 863.  =
  864. 864.  customer.getRentals();
  865. 865.  
  866. 866.  
  867. 867.  
  868. 868.  
  869. 869.  assertEquals(1200,
  870. 870.  shop.getTotalFee(
  871. 871.  rentalList));
  872. 872.  
  873. 873.  
  874. 874.  
  875. 875.   }  
  876. 876. 코드 리뷰테스트에서도 최대한 SRP를 지킨다 if(c.rent(v,
  877. 877.  1))
  878. 878.  { Assert.assertEquals(1,
  879. 879.  v.getRentalPeriod()); }
  880. 880.  else
  881. 881.  {
  882. 882.  
  883. 883.  
  884. 884.  
  885. 885.  fail(); }
  886. 886.  
  887. 887.   ===
  888. 888.  
  889. 889.   Assert.assertTrue(c.rent(v,
  890. 890.  1)); Assert.assertEquals(1,
  891. 891.  v.getRentalPeriod());
  892. 892. 기타 주제들 54
  893. 893. 데이터 베이스 테스트 55
  894. 894. 테스트 자동화- EclEmma, Covertura 56
  895. 895. Lessons Learned 57
  896. 896. one of ten, you will fail..
  897. 897. QAblog.doortts.comdoortts@gmail.com 59
  898. 898. 실습 – 모바일 교통카드 2nd-  장비 : 핸드폰, 단말기-  GPS 및 JVM 탑재되어 있음-  네트워크 통신은 고려하지 않음 60
  899. 899. 변동사항 발생!1. 광역버스 추가! 기본요금 1700원2. 거리에 따른 일반버스 추가요금 발생! 10km 초과 시 매 5km 마다 100원 가산 * 단, 광역버스는 거리에 따른 추가요금 없음 61

×