吐血Eclipse Maven Selenium TestNG的各种坑

时间:2022-12-18 15:09:32

刚入坑不久,有些是自己知识储备不够造成的,有些...那就是坑

在eclipse里面新建maven项目,然后添加testgn依赖,不多说,这个简单。

第一个坑:

然后在src/test/java这个文件夹里面写selenium的Java测试脚本。写完脚本,用eclipse点击run as testng test运行,毫无问题完美。

那么问题在哪?坑在哪?

在于:如果我要把写的java脚本打包成jar文件放到别的电脑上用Java命令:java -jar yourjava.jar这种方式来运行就会出现问题。

解决方案:把测试脚本放到src/main/java里面,不要放到src/test/java里面。

so easy。

第二个坑:

哪有那么简单的事儿。如果这么简单的话就不会吐血了

我们不是把java脚本打包成jar了嘛,别忘了我们的用的是testNG,testNG是不需要main()函数的。

问题来了:运行jar文件,没有main函数会报错,好吧,我添加一个main函数还不行吗。

可是这个main函数是随便添加的吗?添加的main函数能调用testng的注解标注的各种@Test吗?

不能!不能!不能!得按照testng相关的方法来添加main函数,代码如下:

Google说还有其它办法,但是没试过,所以就记录清测有效的方法

package com.qa.test;
import java.util.ArrayList;
import java.util.List; import org.testng.TestListenerAdapter;
import org.testng.TestNG; public class StartNG {
@SuppressWarnings("deprecation")
public static void main(String[] args) { System.out.println("=============This is main()===========");
System.out.println("=============Start NG==========="); TestListenerAdapter tla = new TestListenerAdapter();
TestNG testng = new TestNG();
List<String> suites=new ArrayList<String>();
suites.add("C:\\eclipse-workspace\\SeleniumFrameworkV3DD\\testng.xml");//path to xml.//注意,这里是绝对路径,这里需要改进。
testng.setTestSuites(suites);
testng.run(); }
}

好,这个坑已经解决,这是自己对maven和testng不熟悉的原因。

第三个坑:

想想啊,我要执行selenium+tetsng的测试,肯定要把这些依赖的包也打包进jar文件不,不然怎么运行呢。

于是就用了这个maven-assembly-plugin.把这段加进maven项目的POM.XML文件里。

        <plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.qa.test.StartNG</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>

然后打包成jar,在运行jar,就会出现下面的问题。

吐血Eclipse Maven Selenium TestNG的各种坑

根据提示:no main manifest attribute.这是什么鬼意思。

根据大量Google结果,意思是在生成的jar包里面少了个MANIFEST.MF文件,这个文件的路径:META-INF/MANIFEST.MF

这个文件是在生成的jar包里,不是eclipse的项目文件夹里面那个。

好吧,我去打开jar包看看有没有这个文件。

一看就来气了,这个文件是存在的。

继续Google,又又一些老外说是MANIFEST.MF少了个main class参数啊。

这就郁闷了,前面添加maven-assembly-plugin的时候明明加了main class的,为何main class死活不在MANIFEST.MF这个文件里呢。

在这要吐槽eclipse,这是由于我打包是用的eclipse->run as->maven install

吐血Eclipse Maven Selenium TestNG的各种坑

老子用Eclipse run as->Maven Install打包有嘛错啊,真气人。

继续 Google吧,stack上面点击率最高的就是这个了。

吐血Eclipse Maven Selenium TestNG的各种坑

那么多老外点赞这恶鬼解决方案为啥在我这儿还是行不通呢, main class为啥还是没有加到那个破文件里面去呢?

继续google吧,这一来而去不知不觉就特么花了两个小时。

突然在google上搜到,要打开maven命令行去运行上面截图里的代码。

好吧,怀着试一试的心情,敲命令吧。

Oh LA,命令管用了,能在破文件里找到main class了。那还不赶快java -jar去看看。

吐血Eclipse Maven Selenium TestNG的各种坑

好吧,运行正常,问题解决。

附上外国友人的链接:

点赞很多的是这个。

How can I create an executable JAR with dependencies using Maven?
https://*.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven?rq=1

下面这些也很有帮助。

Maven Assembly Plugin is not setting the MainClass manifest setting
https://*.com/questions/7785456/maven-assembly-plugin-is-not-setting-the-mainclass-manifest-setting

Can't execute jar- file: “no main manifest attribute”
https://*.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute

How to run TestNG tests from main() in an executable jar?
https://*.com/questions/16465695/how-to-run-testng-tests-from-main-in-an-executable-jar?rq=1

how to call testng.xml from java main method?
https://*.com/questions/23272861/how-to-call-testng-xml-from-java-main-method?noredirect=1&lq=1

这个对maven打包的几种plugin做了比较详细的解释

https://www.baeldung.com/executable-jar-with-maven

这说明啥?Google出来类似问题一大堆,这说明maven打包在遇上testNG和eclipse那这是坑了无数开发和测试啊。

这是在main方法里面加了invoke testng @Test之后的结果, test case 1,2,3在另外一个java文件里,跟main方法不在同一个文件。

吐血Eclipse Maven Selenium TestNG的各种坑

墙裂推荐

How can I create an executable JAR with dependencies using Maven?

https://*.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven