【问题标题】:Generating JAVA files and using them at runtime生成 JAVA 文件并在运行时使用它们
【发布时间】:2012-06-17 22:49:05
【问题描述】:

我正在尝试 Cedric Beust 在其他线程中建议的以下方法。

您可以将其作为预测试任务自己执行:实现代码生成器 获取 XML 格式的信息,获取对应的 Java 源文件并生成包含所有注释的 TestNG 源文件 放置在正确的位置。然后在该文件上运行 TestNG。

我对代码生成一无所知。有人可以指导我正确的方向吗?一些简单的例子会很棒。

更新:这是我想要生成的模板。

public class <tobeReadFromConfigFile>
{
  @Test(groups="to be read from config file")
  public void <tobereadfromconfigfile>{
     //to be read from config file(Name of function to call)
     //to be read from config file(Name of function to call)
     //to be read from config file(Name of function to call)
  }
  .
  .
  .
}

函数内部的代码将只是函数调用,必须从配置文件中完全读取和复制。

【问题讨论】:

  • 代码生成示例?使用任何模板引擎,例如 FreeMarker,并用 Java 代码以及您需要注入的任何动态内容填充它。
  • @DaveNewton- 是的,代码生成示例适合上述原因。
  • 对您尝试生成的内容一无所知,因此无法提供更具体的帮助。模板可以是任何东西,包括有效的 Java 源代码。例如,您可以在给定外部数据(例如来自 XML)的情况下构建 Java 方法。除了“使用模板和您的数据构建合法的 Java 代码”之外,您没有提供足够的信息来告诉您更多信息。
  • @DaveNewton- 添加了一个示例。
  • 出于空间目的移至回答。只需查看 FreeMarker 文档,了解如何使用它、读取数据、构建上下文和评估模板。无论您选择哪个库,您都将使用基本相同的步骤。

标签: java testing code-generation testng


【解决方案1】:

FreeMarker 模板看起来像这样:

public class ${className} {
    @Test(groups="${testGroups}")
    public void ${testMethodName}() {
        <#list methods as m>
        ${m}
        </#list>   
    }
}

它将从一个上下文中填充,本质上是一个带有classNametestGroups 等条目的哈希映射,这些条目将从您的 XML 文件中读取。 methods 将是一个 Collection(类似于一个列表),也是从 XML 文件中读取的。

当然还有很多其他的模板库;这只是一个例子。

FreeMarker

【讨论】:

  • 配置文件可以是任何东西(XML 或 JSON 或任何东西),对吧?然后我会使用 Fremarker 来读取配置文件并填充模板,对吧?
  • @questions 你是加载配置文件的人——只要你能从中提取你需要的数据并将其转换为 FreeMarker/etc 的东西,它就可以被颠倒写成 uuencoded 斯瓦希里语。可以处理。 FreeMarker 是一个模板引擎——您的代码 会消化配置信息并为模板设置上下文。如果您想在没有代码的情况下直接从 XML 转到 Java,请使用 XSL (ew)。你也可以只使用 Groovy/JRuby/etc。解析 XML 并发出 Java 代码。
  • 太好了.. 谢谢。这看起来是不是一个好方法,我将使用上面生成的类与 TestNG?
  • @questions 你可以随心所欲地使用生成的代码——模板的输出是任意的,只要它做你需要的,它可以是任何东西。
【解决方案2】:

我编写了一个 Eclipse 插件,它使用 freemarker 模板并提供命名 java 类的上下文作为来自 org.eclipse.jdt.core 的 ICompilationUnit。你可以在https://github.com/karajdaar/templator查看它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多