Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试硬编码数据的最佳方法_Java_Parsing_Testing_Junit - Fatal编程技术网

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

Java 测试硬编码数据的最佳方法,java,parsing,testing,junit,Java,Parsing,Testing,Junit,我有一个类,它解析html页面中的数据并将其转换为字符串集合。基本上,我有一个网上商店的网址,我想有一个项目清单。 我的班级有以下签名: public static List<String> getShopItems() 公共静态列表getShopItems() 通常方法返回非常大的列表(4k项或更多)。 我的问题是,如何测试这个方法? 我认为我必须声明返回的列表大小正确,并且包含所有需要的项。但创建包含4k项的列表并比较实际列表和预期列表将非常繁琐。此外,项目可能会在未来发生变

我有一个类,它解析html页面中的数据并将其转换为字符串集合。基本上,我有一个网上商店的网址,我想有一个项目清单。 我的班级有以下签名:

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

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

您测试的是从网页中提取数据,而不是网页本身。因此,您可以(也应该)创建自己的测试页面。这样,你可以

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

    • 一种简单的方法是将预期的项目保存在本地文件中。然后,您可以加载文件内容,将所有项目存储在排序列表中,并将其与您的商店项目(排序)列表进行比较。

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

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

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

      真实数据测试 尝试使用真实来源的数据,这可能是实时站点,但在运行测试时可能并不总是可用。此外,它可能波动太大,无法为编写适当的单元测试。至少要编写一个测试,只有在编写系统时出错(而不是在站点中的数据发生更改时),该测试才会失败。因此,大多数时候,我会选择较早保存的数据集,这样我就可以在数据集上断言更多的内容

      现在您必须在测试中具有创造性:尝试断言数据的属性。例如(试着挑选几个!):

    • 价目表中的所有价格都必须为正
    • 函数中的彻底错误检查没有错误
    • 检查项目的数量。对于真实数据,请含糊其辞地执行此操作;对于虚假数据,请检查准确的数字
      首先,像这样的静态方法几乎总是一个坏主意,因为它们使测试变得困难

      其次,
      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);
              }
          }
      }
      
      公共类ShopItemProvider{
      私人最终资源;
      公共ShopItemProvider(资源){
      这个资源=资源;
      }
      @凌驾
      公共列表getShopItems(){
      try(InputStream in=resource.getStream()){
      返回someFancyParseMethod(in);
      }
      }
      }
      
      现在,您已经获得了测试所需的钩子。在一个测试用例中,您可以模拟一个InputStream,其中只有一些记录,可能是从测试类路径中获取一个测试文件

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

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

    • 如果列表必须根据测试的意图进行排序,我认为