全网最靠谱的SpringBoot+TestNG+Maven打包成jar运行单元测试

本文讲述了作者在将SpringBoot+TestNG项目打包成jar并执行单元测试时遇到的问题及解决过程。主要难点在于如何在jar包中运行TestNG测试,并通过阅读源码找到解决方案,利用TestNG的main方法和命令行参数成功执行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

认识自己的无知是认识世界最可靠的方法————互联网中的无名之辈

背景

公司最的海外项目临近上线,国内所有的环境都进行了单元测试,唯有海外环境还没进行,所以公司需要在海外环境进行单元测试。公司使用的是SpringBoot+TestNG写的单元测试,单元测试中去调用了其他微服务的Service。在国内环境只需要在本地或者jenkins上执行测试命令,比如通过mvn test 或者在IDEA里面直接执行对应的testng.mxl文件。

由于海外环境网络的限制和服务的限制公司需要将SpringBoot+TestNG打成jar包的形式去执行。不巧这个任务分配到我这了,我一听,哦,就是打个jar包跑测试啊,那岂不是洒洒水。

在这里插入图片描述

初探

坑1

我之前遇见的打包都是把单元测试排除的,现在的需求是将测试打包进去于是我就去网上找了找例子。嗯很快就找到了下面这篇博客.。

https://blog.csdn.net/qq_15290529/article/details/78989234

其实写的挺好的,我照做了之后发现问题来了,打包执行的时候需要有程序入口,现在的项目的有一个标准的SpringBoot Application入口,我想都没想就把它设置成了入口,不一会儿我的jar包就完成了。

后面我怀着不屑运行了java -jar 启动了程序,不出意外Application正常启动,等了等,嗯…嗯?不对劲,猛地意识到这个程序的入口有问题,入口应该设置成一个能启动所有TestNG测试的方法。

坑2

于是我开始思考怎么在Application启动的时候去执行单元测试呢?
不一会儿,我看了下面这篇博客之后有思路了.

http://www.voidcn.com/article/p-yehsfrxe-btn.html

我写了一个TestStartService 继承了ApplicationRunner,重写了run方法,我想的是这样能够在启动Application的时候执行单元测试。

@Component
@Order(value = 1)
public class TestStartService  implements ApplicationRunner {
   
   


    @Autowired
    TestNG testNG;

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
   
   
        List<String> suites = new ArrayList<String>();
        suites.add("src/main/resources/testng.xml");
        testNG.setTestSuites(suites);
        testNG.run();
    }
}

测试立马就报错了

Error starting ApplicationContext.

通过DEBUG发现确实是在容器启动的时候去加载了testng.xml,也去找了对应测试类,因为我们的测试类注入了其他系统的Service,但是这样的方式去执行测试的时候不会去加载上下文环境。我又去网上查了一波资料,看到 stackoverflow 上有个一样的需求,但是没人回答,我越来越觉得这个任务是个坑了。

https://stackoverflow.com/questions/63934534/how-to-create-fat-jar-with-tests-sources-and-all-dependencies-on-spring-boot-app

后来跑去读了SpringBoot官方文档、读了TestNG API文档、写了几个自己猜想的idea ,但是任还是失败告终。值得一提的是有一个类在我看到所以资料里面出现率非常高,我先留了个印象,先看看这个类,埋个伏笔。

  org.testng.TestNG

最后的挣扎

这已经是第二天的事情了,昨日几乎找遍了全网有关TestNG的资料,尝试了我能想到的所有方法。距离任务结束就只有8小时左右了,作为刚刚入职的应届生(而且还没过试用期),我真的慌了,甚至都联想了卷包袱走人的场面。

现在该求的人都求了,该找的额资料都找了,唯有源码还没看,于是我就沉下心思看来看源码,因为上面提到的类出现频率最高,所以我就直接从这个类进去开始阅读源码。

  org.testng.TestNG

看到下面这段代码我顿时沸腾了


    public static void main(String[] argv) {
   
   
        TestNG testng = privateMain(argv, (ITestListener)null);
        System.exit(testng.getStatus());
    }
    @Deprecated
    public void configure(Map cmdLineArgs) {
   
   
        CommandLineArgs result = new CommandLineArgs();
        Integer verbose = (Integer)cmdLineArgs.get("-log");
        if (null != verbose) {
   
   
            result.verbose = verbose;
        }

        result.outputDirectory = (String)cmdLineArgs.get("-d");
        String testClasses = (String)cmdLineArgs.get("-testclass");
        if (null != testClasses) {
   
   
            result.testClass = testClasses;
        }

        String testNames = (String)cmdLineArgs.get("-testnames");
        if (testNames != null) {
   
   
            result.testNames = testNames;
        }

        String useDefaultListeners = (String)cmdLineArgs.get("-usedefaultlisteners");
        if (null != useDefaultListeners) {
   
   
            result.useDefaultListeners = useDefaultListeners;
        }

        result.groups = (String)cmdLineArgs.get("-groups");
        result.excludedGroups = (String)cmdLineArgs.get("-excludegroups");
        result.testJar = (String)cmdLineArgs.get("-testjar");
        result.xmlPathInJar = (String)cmdLineArgs.get("-xmlpathinjar")
TestNG是一个Java的框架,所以第一个要求是JDK要安装在你的机器上。 系统要求 JDK 1.5或以上 内存 没有低要求 磁盘空间 没有低要求 操作系统 没有低要求 步骤1 -验证Java安装在你的机器上 现在,打开控制台并执行以下的java命令。 OS 任务 命令 Windows 打开命令控制台 c:\> java -version Linux 打开命令终端 $ java -version Mac 打开命令终端 machine:~ joseph$ java -version 让我们来验证所有的操作系统的输出: OS 输出 Windows java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) Linux java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) Mac java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) 如果你没有安装Java,安装Java软件开发工具(SDK)点击: http://www.oracle.com/technetwork/java/javase/downloads/index.html. 我们假设本教程中安装和使用Java1.7.0_25版本。 第二步:设置JAVA环境 设置JAVA_HOME环境变量指向的基本目录的位置,在你的机器上安装Java。例如: OS 输出 Windows 设置环境变量 JAVA_HOME 为 C:\Program Files\Java\jdk1.7.0_25 Linux export JAVA_HOME=/usr/local/java-current Mac export JAVA_HOME=/Library/Java/Home 添加Java编译器的位置,系统路径。 OS 输出 Windows Append the string; C:\Program Files\Java\jdk1.7.0_25\bin to the end of the system variable, Path. Linux export PATH=$PATH:$JAVA_HOME/bin/ Mac not required 验证Java安装使用命令java-version如上所述。 第3步:下载TestNG的归档文件 下载新版本的TestNGjar文件,详细请点击访问 http://www.testng.org.。在写这篇教程的时候,我下载TestNG中-6.8.jar,并将 testng-6.8.jar 其复制到 C:\>TestNG 目录。 OS 压缩文件名 Windows testng-6.8.jar Linux testng-6.8.jar Mac testng-6.8.jar 步骤4:设置TestNG的环境 设置TESTNG_HOME环境变量指向TestNGjar 存放在您的机器上的基本目录位置。假设,我们已经储存了testng-6.8.jarTestNG各种操作系统上的文件夹如下: OS 输出 Windows Set the environment variable TESTNG_HOME to C:\TESTNG Linux export TESTNG_HOME=/usr/local/TESTNG Mac export TESTNG_HOME=/Library/TESTNG 第5步:设置CLASSPATH变量 设置CLASSPATH环境变量指向TestNGjar文件位置。假设,我们已经储存了testng-6.8.jar, TestNG在各种操作系统上的文件夹如下: OS 输出 Windows 设置环境变量 CLASSPATH 为 %CLASSPATH%;%TESTNG_HOME%\testng-6.8.jar; Linux export CLASSPATH=$CLASSPATH:$TESTNG_
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值