接受测试遗留代码

时间:2012-02-27 18:25:28

标签: java agile legacy-code acceptance-testing

我正在学习敏捷练习课程并且我有一份功课。在课程中,我学习了如何使用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,尝试模拟它或为其编写代理类会产生以下错误:

  

不能继承最终类Class SomeThirdPartyClass

此外,它是不可变的,而公共构造函数没有参数。好像老师故意这样做了......

1 个答案:

答案 0 :(得分:0)

您可以为第三方库编写Proxy课程,然后将该假类型注入RecieptSystem。我推荐JUnit和Mockito,尽管你可以使用其他框架。

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

我已经使用过Selenium和其他验收测试框架,但除非你需要挂钩GUI,否则它们通常都是矫枉过正的。我只想使用JUnit。 FITnesse是您可能会查看的Uncle Bob的FIT更新版本。