Java 如何仅对已更改的源文件运行单元测试?

Java 如何仅对已更改的源文件运行单元测试?,java,unit-testing,ant,junit,Java,Unit Testing,Ant,Junit,有没有办法让ant只为它构建的java类运行单元测试?例如,如果MyClass.java已经过时,ant将构建MyClass.class。之后,我希望它也运行MyClassTest和MyClassTestSuite(如果它们存在的话)。它不必基于命名约定。我可以使用注释或任何其他有效的方法 编辑:有几个人插话说这是个坏主意。如果我计划在不运行所有单元测试的情况下签入,那将是。我的主要项目有超过16k个单元测试,运行大约需要20分钟。我会在签入之前运行它们,但是每次更改文件时运行整个套件是完全不切

有没有办法让ant只为它构建的java类运行单元测试?例如,如果MyClass.java已经过时,ant将构建MyClass.class。之后,我希望它也运行MyClassTest和MyClassTestSuite(如果它们存在的话)。它不必基于命名约定。我可以使用注释或任何其他有效的方法

编辑:有几个人插话说这是个坏主意。如果我计划在不运行所有单元测试的情况下签入,那将是。我的主要项目有超过16k个单元测试,运行大约需要20分钟。我会在签入之前运行它们,但是每次更改文件时运行整个套件是完全不切实际的。对不起,我应该提供更多的上下文。

这没那么容易


看一看。它有你梦寐以求的功能,但它不是免费的。

我不推荐这种方法,很有可能会遗漏由副作用引入的错误。

看看Infinitest,它是一个Eclipse(和Intellij)插件,根据你刚刚更改的源文件运行测试:

有关概述,请参见此处的屏幕广播:


那对我来说似乎是个坏主意。当然,更改的源文件需要测试,但也需要测试依赖于这些文件的任何文件,以及依赖于这些文件的任何文件,等等。您必须跟踪哪个文件依赖于其他哪些文件,这是一个需要解决的相当大的问题


在我看来,如果项目足够大,那么在尝试解决测试的依赖树时会有显著的收益,那么项目可能太大了?也许是时候把它分成几个单独的项目一起工作了,每个项目可以彼此分开进行测试。

我想和其他人说,这是你想要避免的事情。仅为已更改的特定类运行测试用例会带来一种风险,即您将进行更改,从而中断未更改但依赖于某些已更改代码的类的测试


这是一个风险,即使您在编写接口和模拟单元测试中的依赖关系方面过于激进。例如,静态实用程序类可能有许多类直接使用它们。在这里,很容易想象这样一种情况:您可以更改一个静态实用程序方法,确保该方法的测试工作正常,并在没有运行所有测试的情况下中断大量调用该方法的代码。

我知道使用ANT无法做到这一点,但您可以在Eclipse中执行类似的操作

Kent Beck编写了一个名为JUnit Max的Eclipse插件,在保存代码后运行单元测试。它首先运行“最有可能失败”的测试


如果遵循命名约定,您可能可以使用变量来完成。获取已更改文件的列表,并运行相应的测试。但我建议不要这样做,就像其他答案所解释的那样。

MaxCore更喜欢新测试而不是旧测试,快速测试而不是慢速测试,最近失败的测试而不是很久以前失败的测试。无穷大太棒了。没有它我就不会编码。这是我不切换到NetBeans的一个原因screencast链接已断开-我在这里找到它: