我有一个类,它从html页面解析数据并将其转换为String的集合。基本上我有一个在线商店的URL,我想有一个项目列表。 我的班级有以下签名:
public static List<String> getShopItems()
通常方法返回非常大的List(4k项或更多)。 我的问题是,我该如何测试这种方法? 我认为我必须声明返回的列表具有正确的大小并包含所需的所有项目。但是创建具有4k项目的List并比较实际和预期列表将是非常繁琐的。此外,项目将来可能会发生变化,我的测试将失败。
总结一下,我可以从我的方法getShopItems()
获取实际数据,但我不知道如何在测试中获得断言的预期数据。
提前谢谢。
答案 0 :(得分:1)
您正在测试网页中的数据提取,而不是网页本身。因此,您可以(并且应该)制作自己的测试页面。这样,你可以
答案 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)
我通常将这些测试分成两部分:
您可以通过在构造函数中创建一个额外的参数来实现不同的输入(可能是可选的),例如带有测试数据的HTML文件的位置。这允许您将假数据注入到类中。
尝试通过此测试获得100%的代码覆盖率,测试错误处理以及无效数据。为此测试使用多个数据集,并验证所有输出是否正确。
尝试使用来自真实源的数据,这可能是实时站点,但在运行测试时可能并不总是可用。此外,它可能会波动太大,也可以为其编写适当的单元测试。至少打算编写一个只有在编写系统时出错的测试(如果站点中的数据发生变化)。因此,大部分时间我都会使用之前保存的数据集,因此我可以对数据集进行更多断言。
现在你必须在测试中发挥创造力:尝试断言数据的属性。例子可能是(尝试挑选几个!):
答案 3 :(得分:0)