如何从命令行运行JUnit测试案例。

398
我想要从命令行运行JUnit测试用例。 我该如何做到这一点?

类似的Android JUnit问题:https://dev59.com/5mXWa4cB1Zd3GeqPLEFL - n611x007
Android文档:在设备或模拟器上运行测试(从命令行)。 (via andreea.sandu) - n611x007
10个回答

306

对于JUnit 5.x,做法如下:

java -jar junit-platform-console-standalone-<version>.jar <Options>

https://dev59.com/k1QK5IYBdhLWcg3wJMq0#52373592 上可以找到简要摘要,完整细节请参见 https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher

对于 JUnit 4.X,确实如下:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

但是如果您使用的是 JUnit 3.X,请注意类名是不同的:

java -cp .:/usr/share/java/junit.jar junit.textui.TestRunner [test class name]

你可能需要将更多JAR文件或包含类文件的目录添加到类路径中,并使用分号(Windows)或冒号(UNIX / Linux)进行分隔。这取决于你的环境。

编辑:我已经添加了当前目录作为示例。这取决于你的环境以及如何构建应用程序(可以是bin/、build/甚至my_application.jar等)。请注意,Java 6+支持类路径中的通配符,你可以这样做:

java -cp lib/*.jar:/usr/share/java/junit.jar ...

编写测试代码! :-)


@Izap 有没有什么方法可以通过编程确定一个测试是使用JUnit4还是JUnit3? - Goaler444
2
Class.forName吧。我猜这已经是好几年我最后一次编写Java程序了... - lzap
尝试第一个命令,如果不起作用则尝试后者。或者阅读Android文档...不知道。 - lzap
1
"-cp"参数(即CLASSPATH)的文档可以在这里找到(Java 7,Unix):http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/classpath.html 和 这里(教程):https://docs.oracle.com/javase/tutorial/essential/environment/paths.html 和 这里(Java 8,Unix):https://docs.oracle.com/javase/8/docs/technotes/tools/unix/classpath.html 和 这里(Java 8,Windows):https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html。显然,现在支持classpath中的通配符。 - David Tonhofer
2
踩负评。对于JUnit 4.x来说这是不正确的。你的指示会出现“找不到类:[测试类名]”的情况,即使[test class name]在类路径中也是如此。 - Philip Rego
显示剩余5条评论

163

Maven的方式

如果您使用Maven,您可以运行以下命令来运行所有测试用例:

mvn clean test

或者你可以按照以下方式运行特定的测试

mvn clean test -Dtest=your.package.TestClassName
mvn clean test -Dtest=your.package.TestClassName#particularMethod

如果您想在控制台中查看堆栈跟踪(如果有的话),而不是在目标\surefire-reports文件夹中的报告文件,请将用户属性surefire.useFile设置为false。例如:

如果您希望在控制台上查看堆栈跟踪(如果有的话),而不是在目标\surefire-reports文件夹中的报告文件,请将用户属性surefire.useFile设置为false。例如:

mvn clean test -Dtest=your.package.TestClassName -Dsurefire.useFile=false

Gradle方式

如果您使用Gradle,您可以运行以下命令来运行所有测试用例:

gradle test

或者你可以按照以下方式运行特定的测试

gradle test --tests your.package.TestClassName
gradle test --tests your.package.TestClassName.particularMethod
如果你需要更多信息,你可以考虑使用选项,例如--stacktrace、--info或--debug。
例如,当你以info日志级别--info运行Gradle时,它会在测试运行时向你展示每个测试的结果。如果有任何异常,它会向你展示堆栈跟踪,指出问题所在。
gradle test --info

如果您想查看整体测试结果,可以在浏览器中打开报告,例如(在Ubuntu中使用Google Chrome打开):

google-chrome build/reports/tests/index.html

蚂蚁方式

一旦您设置好Ant构建文件build.xml,就可以从命令行运行JUnit测试用例,如下所示:

ant -f build.xml <Your JUnit test target name>

您可以点击下面的链接了解如何在Ant构建文件中配置JUnit测试:

https://ant.apache.org/manual/Tasks/junit.html

普通方法

如果您不使用Maven、Gradle或Ant,您可以按照以下方法操作:

首先,您需要编译测试用例。例如(在Linux中):

javac -d /absolute/path/for/compiled/classes -cp /absolute/path/to/junit-4.12.jar /absolute/path/to/TestClassName.java

然后运行您的测试用例。例如:

java -cp /absolute/path/for/compiled/classes:/absolute/path/to/junit-4.12.jar:/absolute/path/to/hamcrest-core-1.3.jar org.junit.runner.JUnitCore your.package.TestClassName

使用最新的方法进行Groovy测试怎么样? - midori
有没有特别的原因使用clean? - capa_matrix
在新构建之前,Maven 应该清除上一次运行生成的所有内容,例如类、JAR 包、从 WSDL-S 自动生成的类(如果使用)等等。 - Shtefan

54

@lzap 给出的答案是一个很好的解决方案。但是我想补充一点,你应该将 "." 添加到类路径中,这样你的当前目录就不会被遗漏,导致你自己编写的类也被遗漏。在某些平台上,我就遇到过这种情况。因此,针对 JUnit 4.x 的更新版本应该是:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

1
那应该是一个分号吗? - panny
14
在 Windows 上,分号表示路径的分隔符;而在类 Unix 环境下(至少包括 OSX 和我用过的所有 Linux 发行版),使用冒号作为路径的分隔符。 - rand_acs
1
@rand_acs 测试类名需要是完全限定的类名吗? - Goaler444
1
@Goaler444 是的,我总是使用完整的名称,并指定所有的命名空间。 - rand_acs

24

确保JUnit.jar在您的类路径中,然后从控制台调用命令行运行程序

java org.junit.runner.JUnitCore [测试类名称]

参考文献: junit FAQ


5
你还需要设置项目其余部分的类路径。 - Thilo
2
即使[test class name]在类路径中,这只会返回"找不到类:[test class name]"的错误。 - Philip Rego

20

在JUnit 4.12中,以下内容对我无效:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

显然,从JUnit 4.11版本开始,您还应该在类路径中包括hamcrest-core.jar

java -cp .:/usr/share/java/junit.jar:/usr/share/java/hamcrest-core.jar org.junit.runner.JUnitCore [test class name]

我在使用JUnit 4.12时遇到了同样的问题。我想出了一个类似的解决方案,但它对我不起作用,无法加载JUnitCore。我基本上切换到JUnit 4.8.2,因为它不需要在类路径中包含hamcrest-core.jar。 - Vladimir Nazarenko
确认必须使用JUnit 4.12完成。+1。 - rayryeng
这对我有用:java -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore [测试类名] - khatchad

12

在 Windows 系统中,可以使用以下命令行语句来执行 JUnit(版本 4+)测试:

java -cp .;/path/junit.jar org.junit.runner.JUnitCore TestClass [无需 .class 扩展名的测试类名]

例如: c:\>java -cp .;f:/libraries/junit-4.8.2 org.junit.runner.JUnitCore TestSample1 TestSample2 ... 依此类推,如果有多个测试类。

-cp 代表 class path,点号(.)表示现有的类路径,分号(;)将额外给定的 jar 文件附加到类路径上。因此,在上面的示例中,junit-4.8.2 现在可用于类路径,以执行我们使用 JUnitCore 类来执行测试类。

以上命令行语句帮助您在命令提示符(即 MSDos)下执行 junit(版本 4+)测试。

注意:JUnitCore 是执行 junit 测试的门面,此门面已包含在 4+ 版本的 junit 中。


请简要解释您的答案。 - Mohit Jain
我并没有要求你回答要简短。我请求你加上一些解释(至少简要解释)。解释你的回答是一个好的习惯。读者可以理解它,喜欢它,点赞它。 - Mohit Jain
如果我有一个补充测试 jar 文件和普通的 junit jar 文件,那么我必须在 java -cp 命令中同时包含这两个文件才能使任何东西正常工作?有没有办法避免把所有这些都放到命令行中,以便我不必输入太多的内容? - Ungeheuer

6
如果您的项目是基于Maven的,您可以使用以下命令运行属于'my-module'模块的测试类CustomTest中的所有测试方法:
mvn clean test -pl :my-module -Dtest=CustomTest

使用以下命令仅运行测试类 CustomTest 中的一个测试方法 myMethod:

mvn clean test -pl :my-module -Dtest=CustomTest#myMethod

为了使用这个功能,您需要Maven Surefire插件v.2.7.3+和Junit 4。 更多细节请参见:http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

5
实际上,您可以将Junit测试制作为可运行的Jar文件,并调用可运行的Jar文件,如下所示: java -jar

2
在Eclipse中,右键单击您的JUnit项目-> 点击导出-> 选择Java-> 可运行的Jar文件。 - Indraneel

4
个人而言,我会使用Maven Surefire JUnit运行器来实现这个功能。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接