Java 验收测试遗留代码

Java 验收测试遗留代码,java,agile,legacy-code,acceptance-testing,Java,Agile,Legacy Code,Acceptance Testing,我正在学习敏捷实践课程,我有一个家庭作业。在课程中,我学习了如何使用FIT进行自动验收测试。从我所看到的情况来看,FIT似乎正在消亡,我不再确定这是否是我想用于家庭作业的技术。无论如何 我有遗留系统要测试,所有东西都设计/编码得很糟糕。当然,没有测试,在编写任何验收测试之前,我不允许重构或更改功能 为了简单起见,让我们假设该系统是一个车间收据系统,它将产品列表以及价格和总成本打印到标准输出流中。大概是这样的: public class ReceiptSystem { List<Pr

我正在学习敏捷实践课程,我有一个家庭作业。在课程中,我学习了如何使用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);
    }
}
接收预期输出:

 ------------------
| receipt          |
 ------------------
| 111111111: 1.99  |
 ------------------
| 123456789: 2.99  |
 ------------------
| 987654321: 3.99  |
 ------------------
| 999999999: 4.99  |
 ------------------
| TOTAL: 13.96     |
 ------------------
但我如何在不知道价格的情况下实现这一目标?最好的策略是什么?有没有其他框架来实现这一点

多谢各位

更新:SomeThirdPartyClass是最终类,尝试对其进行模拟或为其编写代理类将出现以下错误:

无法子类化final类SomeThirdPartyClass

此外,它是不可变的,并且公共构造函数没有参数。似乎是老师故意做的……

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

如果只允许您进行端到端测试,那么您可以尝试向其输入并保存输出,然后在此基础上创建回归测试。除非您对程序有要求,否则不要费心猜测输出应该是什么。只要捕获它并将其转换为回归测试,就可以安全地进行重构

我曾经使用过Selenium和其他验收测试框架,但除非您需要挂接GUI,否则它们通常都是多余的。我只会使用JUnit。是Bob叔叔发布的FIT的更新版本,您可以查看。

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

如果只允许您进行端到端测试,那么您可以尝试向其输入并保存输出,然后在此基础上创建回归测试。除非您对程序有要求,否则不要费心猜测输出应该是什么。只要捕获它并将其转换为回归测试,就可以安全地进行重构


我曾经使用过Selenium和其他验收测试框架,但除非您需要挂接GUI,否则它们通常都是多余的。我只会使用JUnit。是Bob叔叔的FIT的最新版本,您可以查看。

谢谢,@GarrettHall。没错,在真实情况下我会这么做。但在编写任何代码之前,我不允许以任何方式更改代码,因为这是家庭作业要求的一部分……然后捕获输出,然后从中创建回归测试。FITnesse是FIT的更新版本,您可能想查看一下,但JUnit应该可以正常工作。我同意@GarrettHall。您可以使用模拟框架,比如模拟来自第三方库的响应。例如:Mockito.when甲基二氮PartyLibrary.CalculatePrice 11111111.Then Return1.99;好的,我本来打算这样做的,但是我得到了一个错误,因为我试图模拟的类被声明为final,不能子类final类SomeThirdPartyClass。。。更新了原始问题为第三方类编写代理并模拟它。或者使用PowerMock。谢谢,@GarrettHall。没错,在真实情况下我会这么做。但在编写任何代码之前,我不允许以任何方式更改代码,因为这是家庭作业要求的一部分……然后捕获输出,然后从中创建回归测试。FITnesse是FIT的更新版本,您可能想查看一下,但JUnit应该可以正常工作。我同意@GarrettHall。您可以使用模拟框架,比如模拟来自第三方库的响应。例如:Mockito.when甲基二氮PartyLibrary.CalculatePrice 11111111.Then Return1.99;好的,我本来打算这样做的,但是我得到了一个错误,因为我试图模拟的类被声明为final,不能子类final类SomeThirdPartyClass。。。更新了原始问题为第三方类编写代理并模拟它。或者使用PowerMock。
 ------------------
| receipt          |
 ------------------
| 111111111: 1.99  |
 ------------------
| 123456789: 2.99  |
 ------------------
| 987654321: 3.99  |
 ------------------
| 999999999: 4.99  |
 ------------------
| TOTAL: 13.96     |
 ------------------