测试硬编码数据的最佳方法

时间:2015-09-09 08:06:39

标签: java parsing testing junit

我有一个类,它从html页面解析数据并将其转换为String的集合。基本上我有一个在线商店的URL,我想有一个项目列表。 我的班级有以下签名:

public static List<String> getShopItems()

通常方法返回非常大的List(4k项或更多)。 我的问题是,我该如何测试这种方法? 我认为我必须声明返回的列表具有正确的大小并包含所需的所有项目。但是创建具有4k项目的List并比较实际和预期列表将是非常繁琐的。此外,项目将来可能会发生变化,我的测试将失败。

总结一下,我可以从我的方法getShopItems()获取实际数据,但我不知道如何在测试中获得断言的预期数据。 提前谢谢。

4 个答案:

答案 0 :(得分:1)

您正在测试网页中的数据提取,而不是网页本身。因此,您可以(并且应该)制作自己的测试页面。这样,你可以

  • 减少所需项目的清单(我假设没有4k种不同的情况?)
  • 确保数据不会改变

答案 1 :(得分:1)

首先,像这样的静态方法几乎总是一个坏主意,它们使测试变得困难。

其次,Resource接口可以真正帮助测试这样的案例。例如:

public interface Resource {
    InputStream getStream();
}

然后你可以重构这个类:

public class ShopItemProvider {
    private final Resource resource;

    public ShopItemProvider(Resource resource) {
        this.resource = resource;
    }

    @Override
    public List<String> getShopItems() {
        try (InputStream in = resource.getStream()) {
            return someFancyParseMethod(in);
        }
    }
}

现在,您已经获得了测试所需的钩子。在测试用例中,您可以使用其中的几条记录来模拟一个InputStream,可能从测试类路径中获取测试文件。

在生产环境中,InputStream可以来自URL或File,也可能来自某些生产类路径资源。

答案 2 :(得分:0)

我通常将这些测试分成两部分:

  1. 使用基本/小数据集彻底测试功能
  2. 使用真实数据测试一些基本属性
  3. 您可以通过在构造函数中创建一个额外的参数来实现不同的输入(可能是可选的),例如带有测试数据的HTML文件的位置。这允许您将假数据注入到类中。

    基础测试

    尝试通过此测试获得100%的代码覆盖率,测试错误处理以及无效数据。为此测试使用多个数据集,并验证所有输出是否正确。

    真实数据测试

    尝试使用来自真实源的数据,这可能是实时站点,但在运行测试时可能并不总是可用。此外,它可能会波动太大,也可以为其编写适当的单元测试。至少打算编写一个只有在编写系统时出错的测试(如果站点中的数据发生变化)。因此,大部分时间我都会使用之前保存的数据集,因此我可以对数据集进行更多断言。

    现在你必须在测试中发挥创造力:尝试断言数据的属性。例子可能是(尝试挑选几个!):

    1. 价目表中的所有价格必须为正。
    2. 功能中的详尽错误检查不会出现错误。
    3. 检查项目数量。对于真实数据这样做是模糊的,因为假数据会检查确切的数字。

答案 3 :(得分:0)

  1. 从解析数据的方法获取数据的单独方法,以便您可以测试不同的输入(解析方法应该采用字符串或流而不是网址)
  2. 使用自定义的小输入进行非常详细的测试。这应该是你的主要测试部分
  3. 您可以拍摄网页的快照,在本地保存并使用它来测试实际数据。页面结构更改时更新此文件
  4. 最后一部分是集成测试。连接到真正的网页并检查你的解析器是否不抛出异常,如果它仍然提供一些合理的输出(如大于1k元素的列表),检查页面结构是否没有改变。因为页面可能会更改,所以不要测试确切的列表内容。也不要在单元测试中包含集成测试,因为有时页面可能会关闭,网络可能会关闭等等。