1

我做了一个简单的项目,里面有一些测试,我希望能够在其他计算机上启动测试。我使用Run As -> Maven build... -> Goals: package in Eclipse 构建了项目,我在项目的目标文件夹中找到了一个 jar 文件。但是当我尝试使用 cmd 在 cmd 中运行它时,java -jar project.jar出现以下错误:

错误:在 com.example.TestPurchase 类中找不到主方法,请将主方法定义为:public static void main(String[] args) 或 JavaFX 应用程序类必须扩展 javafx.application.Application

据我所知,由于注释,TestNG 不需要任何 Main 方法。这给我带来了一些问题:

  1. 我如何构建我的项目有问题吗?
  2. 我是否理解通过 jar 文件执行测试的方法是否正确?
  3. 我什至必须使用那个 jar 文件吗?因为我可以使用在项目文件夹中的命令行运行测试mvn test

这是我的 pom.xml 文件:

<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>com.example</groupId>
<artifactId>Sightsy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
    <java.version>1.8</java.version>
    <selenium.version>3.12.0</selenium.version>
    <testng.version>6.13.1</testng.version>
    <javafaker.version>0.14</javafaker.version>
    <guava.version>23.2-jre</guava.version>
    <extentreports.version>3.0.7</extentreports.version>
    <extenttestng.version>1.3.1</extenttestng.version>
    <assertj.version>3.8.0</assertj.version>
    <maven.compiler.version>3.7.0</maven.compiler.version>
    <commons.version>3.7</commons.version>
    <commons.io.version>2.6</commons.io.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>${selenium.version}</version>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>${testng.version}</version>
    </dependency>
    <dependency>
        <groupId>com.github.javafaker</groupId>
        <artifactId>javafaker</artifactId>
        <version>${javafaker.version}</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>${guava.version}</version>
    </dependency>
    <dependency>
        <groupId>com.aventstack</groupId>
        <artifactId>extentreports</artifactId>
        <version>${extentreports.version}</version>
    </dependency>
    <dependency>
        <groupId>com.vimalselvam</groupId>
        <artifactId>testng-extentsreport</artifactId>
        <version>${extenttestng.version}</version>
    </dependency>
    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>${assertj.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons.version}</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons.io.version}</version>
    </dependency>
    <dependency>
        <groupId>com.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.version}</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.example.TestPurchase</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>src/main/resources/suites/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
</plugins>
</build>

4

2 回答 2

1

我不熟悉TestNG框架,但我的理解如下:

当“mvn package”被执行时,你的项目被“验证”、“编译”然后“打包”。在编译期间,您的代码将更改为字节码,并且可以由 Java 虚拟机 (JVM) 解释(执行)。这个编译后的代码只有你的应用程序(我假设这是一个在 Java 服务器上执行的应用程序)。

在“打包”步骤中,这些已编译的类(没有测试)被放在 jar 文件中。这个 jar 文件应该只包含你的应用程序(同样,没有测试)——这就是你想要的,因为你的 jar 文件更小并且只包含真正需要的东西。

现在当“mvn test”被执行时,带有测试代码的类被编译然后执行。TestNG “自动”添加主函数,以便 JVM 知道该做什么。请注意,再次运行“mvn package”仍然不会在 jar 文件中包含这些测试。

直接解决您的问题: Ad 1. No Ad 2. 是的,“mvn test”是正确的方法。广告 3. 不,您不应该在测试期间使用 jar 文件。稍后在部署期间使用它。

于 2019-12-13T12:14:12.027 回答
0

首先,您必须有一个带有“main”方法的单独类,您将在其中指定您的 xml 套件文件。

package com.example;
import java.util.ArrayList;
import java.util.List;
import org.testng.TestNG;
public class MainClass {
public static void main(String[] args) {
TestNG testSuite = new TestNG();
List<String> suites = new ArrayList<String>();
suites.add("path_to_your_xml_suite_file_in_target_folder");
testSuite.setTestSuites(suites);
testSuite.run();
 }
}

然后,您需要在 pom.xml 中的 maven-shade-plugin 配置中使用“main”方法指定此类

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>com.example.TestNGMainClass</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>

然后,当您在mvn build package不执行测试的情况下执行时,您将在目标文件夹中拥有一个完全工作的可执行 jar 文件,您可以在命令行中使用java -jar name_of_you_jar_file.jar. 它将需要驱动程序和 xml 套件文件才能工作

于 2019-12-21T10:50:31.387 回答