2012-02-27 60 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进行测试。在正常情况下,我会做这样的事情:

购物清单(输入):

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

收据(预期输出):

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

但我怎么能做到这一点不知道价格?采用什么最好的策略?有没有其他的框架来实现这一目标?

谢谢。

更新:SomeThirdPartyClassfinal,试图嘲笑,或写一个代理类,它会给以下错误:

Cannot subclass final class class SomeThirdPartyClass

而且,它是不可变和公共构造函数没有参数。好像老师讲的目的....

回答

0

你可以写一个Proxy类的第三方库,然后注入类的仿版到RecieptSystem。我建议使用JUnit和Mockito,但也可以使用其他框架。

如果您只允许进行端到端测试,您可以尝试提供输入并保存输出并基于此进行回归测试。除非你对程序有要求,否则不要猜测输出应该是什么。只需捕获它并将其转化为回归测试,以便您可以安全地重构。

我玩过Selenium和其他验收测试框架,但它们通常都是过度杀毒,除非您需要挂接GUI。我只会使用JUnit。 FITnesse是Bob叔叔的FIT更新版本,你可以试试看。

+0

谢谢,@GarrettHall。确切地说,这就是我在真实情况下所要做的。但是我不允许在编写任何代码之前以任何方式更改代码(这是作业要求的一部分...) – satoshi 2012-02-27 18:34:12

+0

然后只捕获输出,然后从中创建回归测试。 FITnesse是您可能想要查看的FIT的更新版本,但JUnit应该可以正常工作。 – 2012-02-27 18:44:03

+0

我同意@GarrettHall。您可以使用模拟框架,如[Mockito](http://code.google.com/p/mockito/)模拟来自第三方库的响应。例如。 'Mockito.when(SomeThirdPartyLibrary.calculatePrice( “11111111”))。thenReturn(“1。99“);' – radimpe 2012-02-27 19:00:55