2012-02-27 6 views
2

저는 민첩한 관행을 따르고 있으며 숙제도 있습니다. 과정 중에 FIT를 사용하여 자동화 된 수락 테스트를 수행하는 방법에 대해 배웠습니다. 내가 볼 수있는 것부터 FIT가 죽어가는 것 같아서 숙제로 사용하려는 기술이 더 이상 확실하지 않습니다. 어쨌든 ...레거시 코드 수락 수락

나는 테스트 할 레거시 시스템이 있으며 모든 것이 잘못 설계/코딩되어 있습니다. 물론 테스트는 없으며 수용 테스트를 작성하기 전에 리팩토링하거나 기능을 변경할 수 없습니다.

간단히하기 위해 제품 목록 (가격 포함)과 총 비용을 표준 출력 스트림에 인쇄하는 상점 영수증 시스템이라고 가정 해 보겠습니다. 이런 식으로 뭔가 :

public class ReceiptSystem 
{ 
    List<Product> boughtProducts = new ArrayList<Product>(); 

    public void buyProduct(Product p) 
    { 
     boughtProducts.add(p); 
    } 

    public void printReceipt() 
    { 
     List<ReceiptLine> receipt = new ArrayList<ReceiptLine>(); 
     int total = 0; 
     int price; 
     for(List<Product> boughtProducts : boughtProduct) 
     { 
      price = SomeThirdPartyClass.calculatePrice(boughtProduct.getBarcode()); 
      System.out.println(boughtProduct + ": " + price); 
      total += price; 
     } 

     System.out.println("TOTAL: " + total); 
    } 
} 

문제는 가격이 외부 라이브러리와 타사 시스템에 의해 계산되는, 그래서 내가 그들을 모르는 내가 어려운 (불가능하지는 않더라도) 수용을 작성 찾아 FIT를 사용하여 테스트하십시오. 가격을 모른 채

------------------ 
| receipt   | 
------------------ 
| 111111111: 1.99 | 
------------------ 
| 123456789: 2.99 | 
------------------ 
| 987654321: 3.99 | 
------------------ 
| 999999999: 4.99 | 
------------------ 
| TOTAL: 13.96  | 
------------------ 

그러나이 어떻게 이것을 달성 할 수

쇼핑 목록 (입력) :

------------------- 
| product's barcode | 
------------------- 
| 111111111   | 
------------------- 
| 123456789   | 
------------------- 
| 987654321   | 
------------------- 
| 999999999   | 
------------------- 

영수증 (예상 출력) 정상적인 경우에는 내가 좋아하는 뭔가를 할 것입니다 ? 채택하기에 가장 좋은 전략은 무엇입니까? 이것을 달성하기위한 다른 프레임 워크가 있습니까?

감사합니다.

업데이트 :SomeThirdPartyClass는, final입니다 그것은 다음과 같은 오류 줄 것이다에 대한 프록시 클래스를 작성을 조롱하거나 시도 :

Cannot subclass final class class SomeThirdPartyClass

또한, 불변의 대중 생성자는 인수가 없습니다합니다. 교사가 의도적으로 만든 것처럼 보입니다.

답변

0

타사 라이브러리에 Proxy 클래스를 작성하고 가짜 버전을 RecieptSystem에 삽입 할 수 있습니다. JUnit과 Mockito를 권장하지만, 사용할 수있는 다른 프레임 워크가 있습니다.

end-to-end 테스트 만 허용 된 경우 입력을 제공하고 출력을 저장하고이를 기반으로 회귀 테스트를 만들 수 있습니다. 프로그램에 대한 요구 사항이없는 한 출력 결과를 추측하지 않아도됩니다. 그것을 캡쳐하고 회귀 테스트로 바꾸면 안전하게 리팩토링 할 수 있습니다.

나는 Selenium과 다른 수용 테스트 프레임 워크를 가지고 놀았지만, GUI를 구부릴 필요가 없다면 일반적으로 과장이다. 나는 JUnit을 사용할 것이다. FITnesse은 Bob 삼촌이 FIT를 업데이트 한 버전입니다.

+0

감사합니다. @ GarrettHall. 바로 그것이 실제 상황에서 내가 할 일입니다. 그러나 어떤 코드를 작성하기 전에 어떤 식 으로든 코드를 변경하는 것은 허용되지 않습니다. 숙제 요구 사항의 일부입니다 ... – satoshi

+0

다음 출력을 캡처하고 그로부터 회귀 테스트를 만듭니다. FITnesse는 체크 아웃하고자하는 FIT의 업데이트 된 버전이지만 JUnit은 잘 작동합니다. –

+0

나는 @GrerettHall에 동의한다. [Mockito] (http://code.google.com/p/mockito/)와 같은 조롱 프레임 워크를 사용하여 타사 라이브러리의 응답을 시뮬레이션 할 수 있습니다. 예. 'Mockito.when (SomeThirdPartyLibrary.calculatePrice ("11111111")). thenReturn ("1.9938); ' – radimpe