2

背景:

  • 我正在使用(对我而言)一个相当大的代码库(例如:我目前只检查了一些相关项目,以及它的 > 11000 个类)。
  • Build 是 ant,Tests 是 JUnit,CI 是 Jenkins。
  • 在签入之前运行所有测试不是一种选择,它需要 Jenkins 几个小时。即使对于某些单独的应用程序,它也可能是 45 分钟。
  • 有些测试不引用基于反射的单个方法,在某些情况下甚至不直接引用被测方法的类,因为它们询问聚合器类,并且知道传递方法的模式在这里使用。因为它是一个很大的代码库,超过 10 个开发人员,而且我不是负责人,所以这是我目前无法更改的。

我想要的是能够在签入之前打印出与 git diff 列表中的任何类相距两度(Kevin-Bacon-wise)的所有测试类的列表。这样,当我错过的东西最终运行并出现错误时,我可以将它们全部运行并减少来自 Jenkins 的愤怒电子邮件。

我能想到的最简单的方法是自己用 Ruby 脚本或类似的脚本编写代码,这样我就可以解释我们正在使用的一些模式,但要做到这一点,我需要能够查询“哪个类引用类 X?”

我可以解析 .java 或(更简单的) .class 文件来获取此信息,但我不想:) 有没有办法让 Javac 在编译时以简单的格式导出它?

4

1 回答 1

3

有没有办法让 Javac 在编译时以简单的格式导出它?

AFAIK,不。

但是,还有其他方法可以获取依赖项列表:

(但是请注意,您不太可能获得静态工具来提取来自 等的依赖Class.forName()项。另请注意,由于“编译时间常量”的处理方式,您无法从字节码文件中推断出完整的依赖项集。)


我觉得这里有几个问题:

  • 这听起来像你的构建,实际上你的项目结构是单一的。如果您可以将代码库重组为单独构建的大型模块(根据它们的依赖关系),并单独控制版本,那么您只需要进行完整构建并在发生变化时运行所有单元测试.. . 在其他一切都依赖的模块中。(我可以建议使用“Maven”这个词吗?它确实有助于大型代码库,并且 11,000 个类很大。)

  • 听起来您可能正遭受经典 VCS 系统的“分支很难”问题。

  • 听起来您可能需要更强大的 CI 系统。如果你有更多的内核并且构建框架是正确的,你应该能够获得更快的 CI 构建。(如果你模块化以便重建更少......)

我认为以这种方式解决缓慢的构建/测试周期可能比通过额外的(可能是定制的)工具来进行依赖性分析更容易。

但我认识到,做出这些决定可能不取决于你。

于 2013-04-18T03:42:15.180 回答