我希望能够以编程方式运行项目中的所有测试。 我知道Eclipse具有"作为JUnit运行测试"配置,该配置以某种方式获取项目中的所有测试并运行它们。 我是否可以通过编程方式获取测试列表并运行它们? 还是有什么好方法可以构建一个包含所有测试用例的测试套件,而无需手动列出每个测试用例(全部700多个)?
我已经尝试了Eclipse中的" New ...-> Test Suite"选项,但这似乎仅适用于JUnit 3,通过从TestCase扩展来识别测试
测试类是JUnit 4,因此它们唯一的区别是注释,没有命名约定,没有TestCase的子类。
提前致谢!
看看是否有帮助:burtbeckwith.com/blog/?p=52
虽然它并不能真正解决您的紧迫问题,但我发现创建套件和套件套件是非常有用的一般做法,例如(例如PackageFooSuite等软件包),然后将这些套件再次组合成一个或多个套件(例如ModuleFooSuite),并具有一个顶级套件(例如AllTestsSuite)。这样一来,既可以一步运行所有测试,又可以轻松运行我当前正在使用的程序包的子模块测试(并且可以比我始终运行所有测试更快的速度运行):
@RunWith(Suite.class)
@Suite.SuiteClasses({ PackageFooSuite.class, PackageBarSuite.class} )
public final class AllTestsSuite {} // or ModuleFooSuite, and that in AllTests
我倾向于同意你的看法。不幸的是,在我之前从事此工作的人们并没有留下大约700个或更多的用例,而我并不热衷于手工将它们手工串在一起
@alexloh:是的,可以理解。自动执行此操作可能没有太多麻烦,例如:对于每个包/目录,创建一个由当前包/目录中所有文件的名称组成的套件类。如果从底部目录开始,则在上面的级别中包含为子软件包生成的套件可能也相对简单。
没有其他答案对我有用。我需要运行40k个测试,因此不能手动列出每个类。
我用ClasspathSuite完成的。在类路径中运行所有Junit4和Junit3测试用例的测试套件如下:
import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import static org.junit.extensions.cpsuite.SuiteType.*;
@RunWith(ClasspathSuite.class)
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
/* main method not needed, but I use it to run the tests */
public static void main(String args[]) {
JUnitCore.runClasses(RunAllSuite.class);
}
}
我需要从命令行运行它,所以这就是我所做的:
下载cp-1.2.6.jar
创建前面提到的RunAllSuite
编译类javac RunAllSuite.java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar
在类路径java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar;path/to/runallsuite/folder;target/classes;target/test-classes RunAllSuite中使用目标测试运行它
就是这样。通过上面的RunAllSuite,您可以在代码中的任何位置执行JUnitCore.runClasses(RunAllSuite.class),该操作将在类路径中运行所有测试。 ClasspathSuite主页中还介绍了其他配置选项。
还要注意,上面给出的类不会打印任何内容。如果需要的话,你可以做
import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import org.junit.internal.TextListener;
import static org.junit.extensions.cpsuite.SuiteType.*;
@RunWith(ClasspathSuite.class)
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
public static void main(String args[]) {
JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));
junit.run(RunAllSuite.class);
}
}
"我需要运行40k个测试,因此手动列出每个课程不是一个选择。"您是否可以使用某种文本处理程序来扫描这些测试类文件的名称并创建用于运行测试的代码?也就是说,对于每个.java文件,请在RunAllSuite类中打印一行内容为JUnitCore.main( $thatfilename.class );的行-并非您的代码已不起作用。
@Jan即使我们不切实际,类的大小也有其局限性(准确地说是64k个字符)。我看不到所有这些测试名称如何适合。
嗯,好点。我不知道有一个硬限制!此外,您的解决方案已经非常优雅!
在Eclipse中(我正在使用4.6.1)-右键单击项目文件夹,选择"运行方式",选择" JUnit测试"
它将运行该项目中的所有测试。包裹也一样。
感谢您的简单回答。非常感激。
当src / test / java下有多个软件包时不起作用
您可以使用surefire插件在maven中轻松完成此操作:通常,在比较项目的Eclipse使用情况(mvn eclipse:clean eclipse:eclipse)之前,我先从命令行清理/编译/安装我的项目,并且可以在pom中定义一个测试套件,其中列出了每次运行mvn install时,要整体运行的所有测试。您并不是完全以编程方式调用它们,但可以肯定地将它们整体调用。
嗯...我不使用Maven,但是如果能解决我的问题,我会尝试一下。如果发现无效,请在此打勾。谢谢!!
在使用Spring的过程中,
实现一个TypeFilter,该类将类与使用@Test注释的方法进行匹配(不要忘记考虑超类)
在最顶层的测试包上调用类路径扫描
用扫描结果调用JUnitRunner
有关类路径扫描和自定义类型过滤器的更多信息,请参见此处
使用"运行配置"对话框中的Eclipse Indigo(可能还有Helios),您现在可以运行选定项目,程序包或源文件夹中的所有测试。
Eclipse的一个很好的参考是文章在Eclipse中使用JUnit 4.x进行Java单元测试。
我还建议使用JUnit Suite批注。点击链接获取更多详细信息。
这听起来像是要明确避免手动列出OP。