使用代码生成来生成测试数据

时间:2017-02-08 08:04:45

标签: java debugging code-generation

我经常遇到这样的情况:我想将一个大对象图(运行时或调试期间)的内容保存到一组重新创建此对象图的语句中。然后,这可以用作单元测试用例中的测试数据。

screenshot of debugger

对象图的叶子是标准类型(StringBigDecimalDate等),并且分支遵循bean约定(getters,setters,empty constructor),应该可以生成这种文件(例如TestData.java):

   public static Car createCar() {

    Wheel wheel1 = new Wheel();
    wheel1.setTypePressure( 2.1f );
    Wheel wheel2 = new Wheel();
    wheel2.setTypePressure( 2.3f );
    Wheel wheel3 = new Wheel();
    wheel3.setTypePressure( 2.0f );
    Wheel wheel4 = new Wheel();
    wheel4.setTypePressure( 2.8f );
    List<Wheel> wheels = new ArrayList<>( Arrays.asList( wheel1, wheel2, wheel3, wheel4 ) );

    Brake brake = new Brake();
    brake.setBrakeType( BrakeType.PLAIN );

    Car car = new Car();
    car.setBrake( brake );
    car.setWheels( wheels );
    car.setColor( "blue" );

    return car;
}

将它以某种方式直接插入到调试会话中真的很棒,但是一些插入语句将“带有内容的java对象图创建代码”输出到System.out的结果也可以正常工作。< / p>

那么,我怎样才能以最有效的方式实现这一目标?

3 个答案:

答案 0 :(得分:2)

好主意,但(可能是自以为是)不是最好的解决方案。

是的,数据可以转换为Java程序;然后需要保存,编译,......

然后出现问题,例如:你想保留源代码,还是编译代码;版本控制(数据或底层JRE)怎么样?

长话短说:Java代码不是一种非常方便的格式来表示数据。因此:不是将数据转换为Java代码,而是将其转换为某些JSON表示形式。

关键在于:当你的课程真正遵循&#34; bean风格&#34 ;;并且他们已经拥有getter / setter / default构造函数 - 然后任何正常的JSON解析器库应该可以正常运行&#34;开箱即用&#34;。你把Car对象扔到它身上;并且很好,标准的JSON。然后你编写一个小帮助工具,读取这些文件并将它们转回Car对象。完成。

这是要走的路(这个建议来自于那些在建筑师想要你正在要求的系统上工作的人;我们花了很多时间和痛苦去那里......但是那个超过10年前;而在2017年,你根本就不再那样做了。)

鉴于您的最新评论(因为您主要对单元测试代码感兴趣);我建议在这里使用构建器模式。

这样你的代码就可以归结为

new CarBuilder().wheel(new WheelBuilder(). ...

关于这一点的好处:有很多方法可以生成这样的构建器;例如,项目Lombok有一个@Builder注释!

无论如何,自动生成构建器的市场非常rich

答案 1 :(得分:0)

我不知道任何IDE插件可以做到这一点,我找不到谷歌搜索。如果没有其他人编写的现有插件(适用于您的IDE),请回答您的问题:

  

如何以最有效的方式实现这一目标?

取决于开发插件是否更有效(你自己!)或者继续手动编写测试用例。

我的猜测是后者会更有效率。

我同意@ GhostCat的观点。如果您的测试用例是“数据密集型”,那么最好为测试数据选择/实现基于文本的串行格式,并以这种方式表达测试数据。根据我的经验,以编码为一堆Java调用来构建对象图的测试数据来读取/修改测试数据更容易。重要的是您的测试用例不是“只写”。

答案 2 :(得分:0)

我会将你的图表保持为一些人类可读但可解析的形式。 XML可能是您的最佳选择,因为语法允许跨文档引用,但任何格式都可以工作 - 甚至是自定义语法。这样您就可以在运行时保持并传输图形,同时支持单元测试的易于修改和重复的测试图。