Java 如何为返回大数据的方法生成测试用例

Java 如何为返回大数据的方法生成测试用例,java,unit-testing,junit,Java,Unit Testing,Junit,该应用程序生成CSV、自定义/选项卡delimeter等报告&为了生成这些报告的测试用例,我使用JUnit-4 但有些方法以格式化输出字符串的形式返回大量数据,必须将其转储到文件中。现在,我面临着为断言生成预期结果的问题 那么如何模拟它,我是否需要再次编写代码,这是非常重要的 在JUnit中编写代码(将代码重新编写为原始代码)是一种好的做法吗?我当然怀疑这一点。如果代码发生变化,它将紧密耦合&测试用例将在将来失败 如何为返回巨大列表的方法制作测试用例,我可以将其限制在数百个以内,但无法模拟预期结

该应用程序生成CSV、自定义/选项卡delimeter等报告&为了生成这些报告的测试用例,我使用JUnit-4

但有些方法以格式化输出字符串的形式返回大量数据,必须将其转储到文件中。现在,我面临着为断言生成预期结果的问题

  • 那么如何模拟它,我是否需要再次编写代码,这是非常重要的
  • 在JUnit中编写代码(将代码重新编写为原始代码)是一种好的做法吗?我当然怀疑这一点。如果代码发生变化,它将紧密耦合&测试用例将在将来失败
  • 如何为返回巨大列表的方法制作测试用例,我可以将其限制在数百个以内,但无法模拟预期结果列表与之进行比较
  • 此外,我正在使用JUnit在应用程序层而不是视图层测试基于web的应用程序的功能。它是好的还是应该转移到其他框架,比如HttpUnit

  • Edit:我正在测试一种方法,该方法将输入作为从数据库获取的ArrayList,然后将输出准备为报告的正确格式字符串。所以基本上,它从数据生成CSV


    另外,有人能指出,单元测试必须遵循的最佳实践很少。我浏览了各种在线资源,但没有太多的关联。

    您正在进行单元测试的方法是一种将数据作为参数并将其转换为CSV的方法。所以它应该只测试这个转换是否有效,并且您应该向它提供最少的必要数据,以验证它在所有情况下是否确实有效

    这个方法应该独立于从数据库中获取数据的方法,并且不应该从数据库中获取大量数据来对这个方法进行单元测试。只需在内存中准备数据,并将其作为测试中数据转换方法的参数:

    List<Foo> data = new ArrayList<Foo>();
    data.add(createFooA());
    data.add(createFooB());
    String csv = myTestedObject.transformToCsv(data);
    assertEquals("...", csv);
    
    List data=new ArrayList();
    data.add(createFooA());
    data.add(createFooB());
    字符串csv=myTestedObject.transformToCsv(数据);
    资产质量(“…”,csv);
    
    单元测试的方法是一种将数据作为参数并将其转换为CSV的方法。所以它应该只测试这个转换是否有效,并且您应该向它提供最少的必要数据,以验证它在所有情况下是否确实有效

    这个方法应该独立于从数据库中获取数据的方法,并且不应该从数据库中获取大量数据来对这个方法进行单元测试。只需在内存中准备数据,并将其作为测试中数据转换方法的参数:

    List<Foo> data = new ArrayList<Foo>();
    data.add(createFooA());
    data.add(createFooB());
    String csv = myTestedObject.transformToCsv(data);
    assertEquals("...", csv);
    
    List data=new ArrayList();
    data.add(createFooA());
    data.add(createFooB());
    字符串csv=myTestedObject.transformToCsv(数据);
    资产质量(“…”,csv);
    
    您到底在测试什么?返回数据的方法(从何处?数据库?基于什么?),或从数据生成CSV的方法?@JBNizet Edited post添加更多内容information@NayanWadekar根据您的编辑,您的方法似乎只进行一些格式化。这就是你需要测试的。在单元测试级别,不需要对“生产”数据进行测试。因此,创建几个(简短的)代表可能出现的各种情况的ArrayList,并检查输出是否如预期的那样。@Assylas是的,我正在设法减少结果,但问题的部分仍然是手动格式化和排列数据。请参考我在JBNizet的帖子上的评论。你到底在测试什么?返回数据的方法(从何处?数据库?基于什么?),或从数据生成CSV的方法?@JBNizet Edited post添加更多内容information@NayanWadekar根据您的编辑,您的方法似乎只进行一些格式化。这就是你需要测试的。在单元测试级别,不需要对“生产”数据进行测试。因此,创建几个(简短的)代表可能出现的各种情况的ArrayList,并检查输出是否如预期的那样。@Assylas是的,我正在设法减少结果,但问题的部分仍然是手动格式化和排列数据。请参考我在JBNizet的帖子上的评论。我在生成“…”时遇到了问题,这是一个非常复杂的部分,它是一个包含每月/每日总计、标题等的报告。手动生成这样的字符串非常困难,有几行有分隔符。单个空间不匹配会导致测试用例失败。一个选项是(直观地)验证测试生成的CSV文件是否正确,将其保存为测试包树中的文件,并更改测试代码以将生成的数据与保存的CSV文件进行比较。我已经尝试过,比较了两个文件。但是每次都必须手动输入数据,因为数据经常被更改。@NayanWadekar如果你的方法也计算总数,那么它可能做了太多的事情,这使得测试更加困难。如果总和是在查询中完成的,那么您需要在那里测试结果,而不是在csv生成器中。另外:为什么数据会频繁更改?除非CSV转换方法的契约发生变化,否则不需要改变测试数据。记住:测试数据不应该是生产数据。它应该是足够的数据来测试方法是否做了它应该做的事情,而不是别的。我在生成“…”时遇到了问题,这是一个非常复杂的部分,它是一个包含每月/每日总计、标题等的报告。手动生成这样的字符串非常困难,有几行有分隔符。单个空间不匹配会导致测试用例失败。一个选项是(直观地)验证测试生成的CSV文件是否正确,将其保存为测试包树中的文件,并更改测试代码以将生成的数据与保存的CSV文件进行比较。我已经尝试过,比较了两个文件。但每次都必须手动输入数据,因为数据经常更改。@NayanWadekar i