Java单元测试实践-04.使用IDEA、Eclipse执行单元测试

Java单元测试实践-00.目录(9万多字文档+700多测试示例)
https://blog.csdn.net/a82514921/article/details/107969340

1. 使用IDEA、Eclipse执行单元测试

使用IDE执行单元测试是常见的执行方式,以下针对IntelliJ IDEA与Eclipse进行说明。

1.1. IntelliJ IDEA

1.1.1. 支持的功能

  • 直接执行测试类

在IDEA中可直接通过Run或Debug执行测试类,会自动添加-ea参数( 参考 https://docs.oracle.com/cd/E19683-01/806-7930/assert-4/index.html 、 https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html#BABDJJFI )。

  • 执行测试方法

在IDEA中可以执行指定测试类的单个测试方法。支持在方法范围内点击“Run”或“Debug”按钮;支持在“Run/Debug Configurations”配置的Configuration->Method中配置需要执行的方法名称。

  • 执行多个测试类

在IDEA中可一次执行多个测试类。支持选中多个类或选择目录执行Run或Debug。

可以同时分批执行多个测试类,如一次执行一个目录中的测试类,会创建多个进程执行,可提高效率,缩短执行时间。

一次执行太多测试类时,有可能会出现异常java.lang.OutOfMemoryError: Java heap space。

  • 导出测试结果

在IDEA的Run或Debug窗口中,可以使用“Export Test Results”按钮导出测试报告,支持HTML、XML等格式,当需要导出测试结果的类太多时,可能会导出失败。

  • 查看测试结果历史记录

在IDEA的Run或Debug窗口中,可以使用“Import Test Results”按钮查看测试结果的历史记录。

  • 复制完成测试的类名/方法名

在IDEA的Run或Debug窗口中,会显示完成测试的类名/方法名,支持选中类名及方法名后复制文本,便于记录测试情况,如测试不通过的类等。

  • 仅显示执行失败的结果

在IDEA的Run或Debug窗口中,取消选中“Show Passed”选项后,只会显示执行失败的结果,便于查看。

  • 重新执行失败的测试类

在IDEA的Run或Debug窗口中,点击“Rerun Failed Tests”按钮,可重新执行失败的测试类。

1.1.2. 对JUnint的支持

查看IDEA执行单元测试类时执行的Java命令,可以分析IDEA对JUnit支持的实现方式。

1.1.2.1. JUnit引用

IDEA执行单元测试时,在“-classpath”参数中指定了IDEA安装目录中的plugins\junit\lib\目录中的junit-rt.jar、junit5-rt.jar文件。

执行的主类为com.intellij.rt.execution.junit.JUnitStarter,在junit-rt.jar中。

1.1.2.2. 执行单个类

IDEA在执行单个测试类时,执行的命令最后会包含被执行类的完整类名,如“adrninistrator.test.testframework.spring.test.TestSpringReuseContext1”。

1.1.2.3. 执行单个方法

在执行单个测试方法时,执行的命令最后会包含被执行类的完整类名及方法名( 使用半角逗号分隔 ),如“adrninistrator.test.testframework.spring.test.TestSpringReuseContext1,test”。

1.1.2.4. 执行多个类

IDEA在执行多个测试类时,执行的命令最后会包含当前用户的临时目录的文件路径,以及socket参数,如“@w@C:\Users\xxx\AppData\Local\Temp\idea_working_dirs_junit.tmp @C:\Users\xxx\AppData\Local\Temp\idea\_junit.tmp -socket52751”。

idea_junit.tmp文件中包含了被执行测试类的包名及完整类名,如下所示:

adrninistrator.test.testframework.spring.test


adrninistrator.test.testframework.spring.test.TestSpringReuseContext1
adrninistrator.test.testframework.spring.test.TestSpringReuseContext2
adrninistrator.test.testframework.spring.test.TestSpringRefreshContextBeforeClass
adrninistrator.test.testframework.spring.test.TestSpringRefreshContextBeforeMethod

1.1.3. main模块与test模块资源文件生效情况

IDEA在执行测试类时,优先使用test模块中的资源文件,对于main模块与test模块均存在的同名资源文件,会使用test模块中的资源文件;对于仅在main模块中存在的同名资源文件,会使用main模块中的资源文件。

  • 查看进程的classpath系统属性

在示例TestConf类中,打印了“java.class.path”系统属性(也可通过jinfo命令查看),main模块与test模块的类及资源文件目录的顺序如下:

out\test\classes
out\test\resources
out\production\classes
out\production\resources

以上分别对应test模块编译后的类目录、test模块的资源文件目录、main模块的编译后的类目录、main模块的资源文件目录,可以确认IDEA在执行测试类时,classpath中test模块的资源文件目录在main模块的资源文件目录之前。

  • 在测试类中获取资源文件路径

applicationContext.xml文件在main模块与test模块的resources目录中均存在,在TestConf类中打印classpath中的applicationContext.xml文件路径,可证明使用了test模块中的资源文件,例如“/E:/UnitTest/out/test/resources/applicationContext.xml”。

TestTableMapper.xml文件仅在main模块的resources目录中存在,在TestConf类中打印classpath中的TestTableMapper.xml文件路径,证明使用了main模块中的资源文件,例如“/E:/UnitTest/out/production/resources/com/adrninistrator/dao/sqlmap/TestTableMapper.xml”。

1.1.4. 修改测试代码执行方式

在IDEA 2019之后的版本,可以选择测试代码及正常执行使用Gradle还是IDEA,默认使用Gradle。

可在IDEA的“File | Settings | Build, Execution, Deployment | Build Tools | Gradle”选项中进行修改,如下图所示。

pic

1.2. Eclipse

1.2.1. 支持的功能

  • 直接执行测试类

在Eclipse中可直接通过Run或Debug执行测试类,会自动添加-ea参数,支持JUnit Test( 使用“Gradle Test”执行方式时会执行其他未指定的类,因此不使用 )。

  • 执行测试方法

在Eclipse中可以执行指定测试类的单个测试方法。支持在“Run Configurations/Debug Configurations”配置的Test->Test method中配置需要执行的方法名称。

  • 执行多个测试类

在Eclipse中可一次执行多个测试类。支持选中目录后使用Run As/Debug As执行JUnit Test( 选中多个类后只支持使用Gradle Test );支持在“Run Configurations/Debug Configurations”配置的“Test”->“Run all tests in the selected project, package or source folder”选择需要执行的测试类所在的工程、包或目录。

  • 导出测试结果

在Eclipse的JUnit窗口中,可以使用“Test Run History”“Export”按钮导出测试报告,为XML格式。

  • 查看测试结果历史记录

在Eclipse的JUnit窗口中,可以使用“Test Run History”按钮查看测试结果的历史记录。

  • 复制完成测试的类名/方法名

在Eclipse的JUnit窗口中,会显示完成测试的类名/方法名,支持选中类名及方法名后复制文本。

  • 仅显示执行失败的结果

在Eclipse的JUnit窗口中,点击“Show Failures Only”按钮后,只会显示执行失败的结果,便于查看。

1.2.2. 对JUnint的支持

通过查看Eclipse执行单元测试类时的Java命令,可以分析Eclipse对JUnit支持的实现方式。

1.2.2.1. JUnit引用

Eclipse执行单元测试时,在“-classpath”参数中指定了Eclipse安装目录中的插件目录,如“configuration/org.eclipse.osgi/409/0/.cp、configuration/org.eclipse.osgi/408/0/.cp”,在以上目录的.api_description文件中,保存了插件名称,如org.eclipse.jdt.junit4.runtime_1.1.1000.v20190510-0840、org.eclipse.jdt.junit.runtime_3.4.1000.v20190510-0840。

执行的主类为org.eclipse.jdt.internal.junit.runner.RemoteTestRunner,在org.eclipse.jdt.junit.runtime插件中。

通过“-testLoaderClass”参数指定了类org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader,在org.eclipse.jdt.junit4.runtime插件中;通过“-loaderpluginname”参数指定了插件名称org.eclipse.jdt.junit4.runtime。

1.2.2.2. 执行单个类

Eclipse在执行单个测试类时,执行的命令最后通过“-classNames”参数指定了被执行类的完整类名,如“-classNames adrninistrator.test.testframework.spring.test.TestSpringReuseContext1”。

1.2.2.3. 执行单个方法

Eclipse在执行单个测试方法时,执行的命令最后通过“-test”参数指定了被执行类的完整类名及方法( 使用半角冒号分隔 ),如“-test adrninistrator.test.testframework.spring.test.TestSpringReuseContext1:test”

1.2.2.4. 执行多个类

Eclipse在执行多个测试类时,执行的命令最后会包含当前用户的临时目录的文件路径,如“-testNameFile “C:\Users\xxx\AppData\Local\Temp\testNames7779770965340024642.txt””。

上述文件中包含了被执行测试类的包名及完整类名,如下所示:

adrninistrator.test.testframework.spring.test.TestSpringRefreshContextBeforeMethod
adrninistrator.test.testframework.spring.test.TestSpringRefreshContextBeforeClass
adrninistrator.test.testframework.spring.test.TestSpringReuseContext2
adrninistrator.test.testframework.spring.test.TestSpringReuseContext1

1.2.3. main模块与test模块资源文件生效情况

  • Eclipse默认的classpath系统属性顺序

Eclipse在执行测试类时,默认情况下会优先使用main模块的资源文件。

在示例TestConf类中打印“java.class.path”系统属性,main模块与test模块的类及资源文件路径的顺序如下:

bin\main
bin\test

以上分别对应main模块编译后的类及资源文件目录、test模块编译后的类及资源文件目录,可以确认Eclipse在执行测试类时,默认情况下classpath中main模块的资源文件目录优先级高于test模块的资源文件目录。

默认情况下,Eclipse的“Java Build Path”的“Order and Export”配置如下所示。可以看到main/java在test/java之前,main/resources在test/resources之前。

pic

  • 修改Eclipse的classpath系统属性顺序

当需要使Eclipse优先使用test模块的资源文件时,可以打开对应工程的Properties配置,“Java Build Path”“Order and Export”标签页,将“test/java”与“test/resources”均移动至“main/java”及“main/resources”之前,Eclipse在执行测试类时,classpath中的test模块的资源文件目录会变为在main模块的资源文件目录之前。

完成上述设置后,Eclipse的“Java Build Path”的“Order and Export”配置如下所示。

pic

完成以上设置后,使用Eclipse执行测试类时,会优先使用test模块的资源文件。

当需要使用Eclipse执行main模块的类时,需要恢复上述配置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值