【问题标题】:Can't run JUnit test cases from the command line无法从命令行运行 JUnit 测试用例
【发布时间】:2018-07-28 16:11:30
【问题描述】:

我正在尝试从命令行(Windows 10 中的 PowerShell)运行测试。 在问这个问题之前,我查看了几个来源并阅读了很多主题,例如

但是当我尝试像在 JUnit wiki 中那样从 PowerShell 运行测试时

cd E:\Dev\AutoTest\Example
java -cp .;/libs/junit-4.12.jar;/libs/hamcrest-core-1.3.jar org.junit.runner.JUnitCore tests.Booking.BookingTests

我得到了输出

CommandNotFoundException


如果我运行相同,但通过旧命令行 (cmd.exe):

cd E:\Dev\AutoTest\Example
java -cp .;E:\Dev\AutoTest\Example\libs\junit-4.12.jar;E:\Dev\AutoTest\Example\libs\hamcrest-core-1.3.jar org.junit.runner.JUnitCore tests.Booking.BookingTests

我得到了输出

java.lang.IllegalArgumentException:找不到类 [tests.Booking.BookingTests] 引起:java.lang.ClassNotFoundException:tests.Booking.BookingTests

在 IDEA 中,项目结构如下所示:

在硬盘上的结构如下所示:

• “out”文件夹包含 *.class 文件

• “src”文件夹包含 *.java 文件


问题:

如何使用我的结构在 PowerShell 的命令行中运行 JUnit 测试用例?

【问题讨论】:

    标签: java powershell junit command-line automated-tests


    【解决方案1】:

    在 PowerShell 中,分号是命令分隔符(允许您将两条语句放在一行中),因此您正在运行 java -cp .(应该输出命令帮助),然后是 /libs/junit-4.12.jar(不被识别为一个命令)。 JUnit wiki 中的示例显然不是为 PowerShell 制作的,而是为 CMD 制作的,它使用 & 符号 (&) 链接命令,因此问题不会出现在那里。

    此外,您在类路径中设置了绝对路径 (/libs/junit-4.12.jar),但您的 libs 目录位于您的项目文件夹中。这就是为什么java 抱怨它找不到类org.junit.runner.JUnitCore。当您从项目目录的根目录运行 JUnit 时,您需要使路径相对于该位置。

    由于您将代码编译到不同的文件夹 (.\out\production\Afl_AutoTest),因此您还必须将该文件夹添加到您的类路径中,否则 JUnit 将无法找到已编译的类(因为它们在类路径之外) .

    将您的类路径放在引号中,添加输出目录,并从库路径中删除前导斜杠,该命令应该可以在 CMD 和 PowerShell 中运行:

    java -cp ".;out/production/Afl_AutoTest;libs/junit-4.12.jar;libs/hamcrest-core-1.3.jar" org.junit.runner.JUnitCore tests.Booking.BookingTests
    

    更好的是,将所有参数定义为一个数组并 splat 它:

    $classpath = '.',
                 'out/production/Afl_AutoTest',
                 'libs/junit-4.12.jar',
                 'libs/hamcrest-core-1.3.jar'
    $params    = '-cp', ($classpath -join ';'),
                 'org.junit.runner.JUnitCore',
                 'tests.Booking.BookingTests'
    
    java @params
    

    不过,后者仅适用于 PowerShell。

    【讨论】:

    • 谢谢你的回答,我也试过这个变种,但如果我在 PS 中使用引号,我会得到错误输出:“无法找到或加载主类 org.junit.runner.JUnitCore”
    • 是的,谢谢,现在 junit 正在尝试开始测试,但是当我写 ealier(关于 cmd.exe)时,我得到了输出 java.lang.IllegalArgumentException: Could not find class [tests.Booking.BookingTests] Caused by: java.lang.ClassNotFoundException: tests.Booking.BookingTests
    • 但是这个类似乎是正确的:tests.Booking.BookingTests(包“tests”,包“Booking”和类“BookingTests”)
    • 谢谢!我项目的最终命令必须包含所有“libs”文件夹文件:libs/java-client-4.1.2.jar;libs/junit-4.12.jar;libs/selenium-server-standalone-3.4.0.jar;libs /hamcrest-core-1.3.jar
    • @SergeyBykov 您应该可以将其简化为-cp ".;out/production/Afl_AutoTest;libs/*.jar"。您甚至可以从类路径中删除.,因为您的项目根目录中似乎没有任何库或类文件(至少不应该有)。
    【解决方案2】:

    最终命令必须包含所有“libs”文件夹文件:

    • java-client-4.1.2.jar

    • junit-4.12.jar

    • selenium-server-standalone-3.4.0.jar

    • hamcrest-core-1.3.jar

    java -cp ".;out/production/Afl_AutoTest;libs/java-client-4.1.2.jar;libs/junit-4.12.jar;libs/selenium-server-standalone-3.4.0.jar;libs/hamcrest-core-1.3.jar" org.junit.runner.JUnitCore tests.Booking.BookingTests
    

    如果不是,输出将是

    Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/Capabilities
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2014-05-30
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多