我使用Maven运行我的Selenium Testng测试,但我正在尝试创建可执行jar,因此其他团队成员可以通过最少的设置从桌面运行自动化套件。
所以我添加了一个主要"跑步者"创建可执行jar的方法。
public class LaunchTests {
public static void main(String[] args) {
TestListenerAdapter tla = new TestListenerAdapter();
TestNG testng = new TestNG();
List<String> suites = new ArrayList();
suites.add("testng.xml");//path to xml..
testng.setTestSuites(suites);
testng.run();
}
}
我最好的猜测是需要将某些内容添加到POM.xml中吗?
当从eclipse或mvn clean test(Surefire插件)手动运行testng测试时,它们运行完美。但是当我尝试作为Java程序运行时,我遇到了这个错误。
Exception in thread "main" org.testng.TestNGException:
Cannot find class in classpath: package.TestOne
at org.testng.xml.XmlClass.loadClass(XmlClass.java:81)
at org.testng.xml.XmlClass.init(XmlClass.java:73)
at org.testng.xml.XmlClass.<init>(XmlClass.java:59)
at org.testng.xml.TestNGContentHandler.startElement(TestNGContentHandler.java:548)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.emptyElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.testng.xml.XMLParser.parse(XMLParser.java:38)
at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:16)
at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:9)
at org.testng.xml.Parser.parse(Parser.java:172)
at org.testng.TestNG.initializeSuitesAndJarFile(TestNG.java:302)
at org.testng.TestNG.run(TestNG.java:991)
at util.LaunchTests.main(LaunchTests.java:17)
的testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite1" parallel="methods" thread-count="1">
<test name="Chrome Adviser Portal" allow-return-values="true"
thread-count="1">
<parameters>
<parameter name="browser" value="chrome" />
<parameter name="loginType" value="adviser" />
</parameters>
<classes>
<class name="adviserPortal.AdviserLogin" />
</classes>
</test>
</suite>
答案 0 :(得分:5)
您提到您可以通过maven surefire插件在eclipse中运行测试,并且只有在执行main方法时才能运行它。
只有当您LaunchTests
课程位于src/main/java
并且您的套件xml文件testng.xml
指的是src/test/java
中的课程时,才会发生这种情况。 src/main/java
内的Java类可以查看位于src/test/java
内的java类。这就解释了为什么TestNG会抛出异常Cannot find class in classpath
如果您的LaunchTests
进入src/test/java
,那么默认情况下它不会包含在您正在构建的超级jar(可执行jar)中,因为省略了测试类。
因此,如果您真的希望能够做到这一点,那么您有两个选择
src/test/java
移至src/main/java
然后使用它(pom文件中的Surefire插件配置可能需要进行一些调整才能让它知道您的测试源不是{{1}但是src/test/java
。src/main/java
之类的内容来引用here来创建一个测试类。答案 1 :(得分:2)
是的,你必须在pom.xml中添加额外的插件来创建一个可运行的jar。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>StackOverFlow</groupId>
<artifactId>StackOverFlow</artifactId>
<version>1.0.0-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.stack.JarCreation.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>attached</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.stack.JarCreation.Main</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.13.6</version>
</dependency>
</dependencies>
</project>
转到您的项目=&gt;右键单击=&gt;运行As =&gt; Maven build ...(有3个尾随点)=&gt;在目标中写清理安装
它将在目标文件夹中创建两个jar。
具有尾随 jar-with-dependencies.jar 的jar是可运行的jar。
将它放在你的镀铬驱动器所在的位置并转到jar的位置并运行它,它会起作用。
答案 2 :(得分:0)
我刚刚为我们的一位工程师解决了这个问题。他已经更新到最新的testng插件,但是我们通过更新他的构建路径到testng 6.11 jar文件(之前他有6.9.6)解决了这个问题。