java - 验收测试遗留代码

标签 java agile legacy-code acceptance-testing

<分区>

我正在学习敏捷实践类(class),并且有作业。在类(class)中,我学习了如何使用 FIT 进行自动验收测试。在我看来,FIT 似乎快要死了,我不再确定它是否是我想要用于作业的技术。无论如何...

我有遗留系统要测试,一切都设计/编码不当。当然没有测试,而且我不允许在编写任何验收测试之前重构或更改功能。

为简单起见,假设该系统是一个商店收据系统,它将产品 list (含价格)和总成本打印到标准输出流。像这样:

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 编写验收测试。在正常情况下,我会做类似的事情:

购物 list (输入):

 -------------------
| 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

此外,它是不可变的,公共(public)构造函数没有参数。看来老师是故意的....

最佳答案

你可以写一个Proxy第三方库的类,然后将类的假版本注入(inject) RecieptSystem。为此,我推荐 JUnit 和 Mockito,尽管您还可以使用其他框架。

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

我已经尝试过 Selenium 和其他验收测试框架,但它们通常都有些矫枉过正,除非您需要连接 GUI。我只会使用 JUnit。 FITnesse是 Uncle Bob 的 FIT 的更新版本,您可以查看。

关于java - 验收测试遗留代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9470166/

相关文章:

java - 在 Intellij 中自动执行重复的编辑操作

java - 如何在 Eclipse 中安装 Web 平台工具?

agile - 类项目的最佳敏捷方法是什么?

javascript - 如何使用 dojo 按定义的顺序加载非 AMD 依赖项?

java - 无法将类型 'org.springframework.batch.item.xml.StaxEventItemWriter' 的值转换为所需类型 'org.springframework.batch.item.ItemReader'

Javac 找不到包中确实存在的类

C#。为遗留代码添加多态性

c - C函数的隐式int返回值

测试遗留代码

process - 使用 Scrum 收集需求