如何从命令行运行JUnit测试用例


333

我想从命令行运行JUnit测试用例。我怎样才能做到这一点?


类似的android junit问题:stackoverflow.com/q/11144466/611007
n611x007

android docs:在设备或仿真器上运行测试(从命令行)。(通过 andreea.sandu)
n611x007 2014年


javac -cp "junit-4.12.jar; hamcrest-core-1.3.jar;." Tests.java为我工作。注意结束点-这很重要!
parsecer

Answers:


274

对于JUnit 5.x,它是:

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

查找在简要https://stackoverflow.com/a/52373592/1431016的全部细节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+确实支持classpath中的glob,您可以执行以下操作:

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

希望能帮助到你。编写测试!:-)


@Izap是否有任何想法以编程方式确定测试是使用JUnit4还是JUnit3?
Goaler444

2
我猜是Class.forName。我上次使用Java编程已经有好几年了……
lzap

如果您使用的是android,该怎么办?
2014年

1
“ -cp”自变量的文档(即CLASSPATH)在此处(Java 7,Unix)此处(教程)此处(Java 8,Unix)此处(Java 8,Windows)。显然现在支持类路径中的通配符。
David Tonhofer 2015年

1
下注。对于JUnit 4.x,这是不正确的。即使在[test class name]位于类路径中,您的指令也会给出“找不到类:[test class name]”。
菲利普·雷哥

117

Maven方式

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

mvn clean test

或者,您可以运行以下特定测试

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

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

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

摇篮方式

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

gradle test

或者,您可以运行以下特定测试

gradle test --tests your.package.TestClassName
gradle test --tests your.package.TestClassName.particularMethod

如果您想了解更多信息,可以考虑使用--stacktrace或--info或--debug等选项。

例如,当您以信息日志记录级别--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

1
我喜欢这个答案,提供了多种技术的实例,荣誉!
乔西·汤普森

使用最后一种方法的常规测试怎么样?
midori '18

1
当之无愧的金色徽章;)
埃里克·杜米尼尔

感谢您的gradle版本!荣誉!
ady 22:49

52

@lzap给出的答案是一个很好的解决方案。但是,我想补充一点,您应该添加。到类路径,这样就不会遗漏当前目录,从而导致您自己的类被遗漏。在某些平台上,这已经发生在我身上。因此,JUnit 4.x的更新版本为:

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

1
那应该是半冒号吗?
panny

14
@panny这是Windows上的分号。在n * nix环境(至少是OSX和我使用过的所有Linux发行版)上,您使用冒号。
rand_acs

1
@rand_acs测试类名称是否需要为完全分类的类名称?
Goaler444

1
@ Goaler444是的,我始终使用全名,并指定了所有名称空间。
rand_acs

22

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

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

参考:junit常见问题


4
您还需要设置项目的其余类路径。
Thilo

即使[test class name]位于类路径中,这也只会显示“找不到类:[test class name]”。
菲利普·雷哥

19

使用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。
弗拉基米尔·纳扎连科

确认必须使用JUnit 4.12完成此操作。+1。
rayryeng

这对我java -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore [test class name]
有用

11

在Windows中

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代表类路径,点(。)代表现有的类路径,而半冒号(;)将附加的给定jar附加到类路径,如上例中的junit-4.8.2现在可以在类路径中执行以执行JUnitCore类,在这里,我们习惯于执行测试类。

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

注意:JUnitCore是执行junit测试的外观,该外观包含在4个以上的junit版本中。


请简要解释您的答案。
Mohit Jain 2014年

我没有要求您简短回答。我要求添加一些解释(至少是简短的解释)。解释答案的工作方式是一个好习惯。读者可能会喜欢它,也喜欢它。
Mohit Jain

因此,如果我有一个补充测试罐和香草junit罐,则必须同时使用java -cp命令中的这两个罐,才能真正起作用?是否有办法将所有这些都放入命令行,这样我就不必键入太多东西了?
Ungeheuer

5

实际上,您还可以使Junit测试成为可运行的Jar,然后将可运行的jar称为java -jar


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

4

如果您的项目是基于Maven的,则可以使用以下命令运行属于模块“ my-module”的测试类CustomTest中的所有测试方法:

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

或使用以下命令从测试类CustomTest中仅运行1个测试方法myMethod:

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

为此,您需要Maven Surefire插件v.2.7.3 +和Junit4。有关更多详细信息,请参见:http ://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


4

我个人将使用Maven surefire JUnit运行程序来执行此操作。



-1

如果您的项目基于蚂蚁,那么您应该可以从控制台执行以下操作:

ant test

如果这不起作用,但是您的项目仍然基于ant,则可以运行ant -p以列出项目的主要目标。


2
Q与蚂蚁无关
accya

3
这就是为什么我说“如果您的项目基于蚂蚁”。另请注意,OP可能不了解蚂蚁。
cherouvim 2013年

我遇到了这个难题,单元测试文件不在Eclipse标记为源的文件夹中。该项目使用ant进行构建,这是运行那些JUnit测试的正确方法。
Andrzej Rehmann 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.