【问题标题】:Run a testNG test suite with a jar / no runnable method使用 jar 运行 testNG 测试套件/无可运行方法
【发布时间】:2017-08-19 05:12:15
【问题描述】:

我需要你的帮助! 在工作中,我需要自动化测试来测试整个应用程序。重点是,我是 Java 和自动化的初学者。

我正在尝试不同的教程,效果很好。但现在,我想进步。我需要以 .jar 的形式提供我的测试。 它不起作用,因为我需要一个主类。我正在尝试添加它,但它不起作用。

更新了我的脚本以更正和简化它们,但我仍然遇到一些问题。现在我有:

启动测试的主类:

package nouguierc.selenium;
import org.testng.TestListenerAdapter;
import org.testng.TestNG;

public class TestRunner {

public static void main(String[] args) {
    System.out.println("Running tests!");
    TestListenerAdapter tla = new TestListenerAdapter();
    TestNG testng = new TestNG();
    testng.setTestClasses(new Class[] { RegistrationTest.class });
    testng.addListener(tla);
    testng.run();
}
}

我收到警告消息:“testNG 类型的 addListener 方法已弃用”

我也有我想要执行的测试(也可以作为一个可运行的 jar):

package nouguierc.selenium;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;
import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import com.relevantcodes.extentreports.LogStatus;
import org.testng.annotations.Test;


public class RegistrationTest{

public  ExtentReports extent;
public  ExtentTest test;
public  int a = 1;
WebDriver driver=null;

@Test //This is TestNG annotation

public void testRegister(){

        extent = ExtentManager.Instance();


                    try{

        System.setProperty("webdriver.chrome.driver", "C:\\Users\\nouguierc\\Desktop\\Projets\\Testing\\Airbus\\Automatisation\\testCélia\\WD_Automation\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.manage().window().maximize();
        driver.get("http://newtours.demoaut.com/");

        test = extent.startTest("VerificationReporting", "AlorsAlors");

        driver.findElement(By.linkText("REGISTER")).click();
        driver.findElement(By.name("firstName")).sendKeys("User1");
        driver.findElement(By.name("lastName")).sendKeys("Surname1");
        driver.findElement(By.name("phone")).sendKeys("123456789");
        driver.findElement(By.name("userName")).sendKeys("user1@test.com");
        driver.findElement(By.name("address1")).sendKeys("Test Address");
        driver.findElement(By.name("city")).sendKeys("Test City");
        Select select = new Select(driver.findElement(By.name("country")));
        select.selectByVisibleText("ANGOLA");
        driver.findElement(By.name("email")).sendKeys("user1@test.com");
        driver.findElement(By.name("password")).sendKeys("user1");
        driver.findElement(By.name("confirmPassword")).sendKeys("user1");
        driver.findElement(By.name("register")).click();

        if(a == 1)
            test.log(LogStatus.PASS, "OK" );
        else
            test.log(LogStatus.FAIL, "NOT OK" );

        driver.quit();

        }

        catch (Exception e) {
            System.out.println(e.getMessage());
            driver.quit();
        }

    extent.endTest(test);
    extent.flush();
    extent.close();
}   

}

我的 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>StackOverFlow</groupId>
<artifactId>StackOverFlow</artifactId>
<version>1.0.0-SNAPSHOT</version>

<properties>
    <maven.compiler.version>1.7</maven.compiler.version>
    <maven.compiler.target>1.7</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
    <sourceDirectory>src/test/java</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>nouguierc.selenium.TestRunner</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>nouguierc.selenium.TestRunner</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>com.relevantcodes</groupId>
        <artifactId>extentreports</artifactId>
        <version>2.41.2</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.9.13.6</version>
    </dependency>
</dependencies>
</project>

当我在 Eclipse 上执行测试时,我得到了这个结果:

Running tests!
[TestNG] Running:
  Command line suite


===============================================
Command line suite
Total tests run: 0, Failures: 0, Skips: 0
===============================================

当我通过 Eclipse 导出 jar 并使用我拥有的 cmd 运行它时:

no manifest attribute in ExecutableJAR.jar

测试正在打开谷歌浏览器到地址“数据;”并且什么都不做。然后我有以下失败的结果:

testRegister java.lang.NullPointerException
at nouguierc.selenium.RegistrationTest.testRegister(RegistrationTest.java:61)
at nouguierc.selenium.TestRunner.main(TestRunner.java:13)
... Removed 22 stack frames

当我删除“driver.quit();”行时在捕获中。测试成功通过,但这不正常,因为它在谷歌浏览器中没有发生任何事情。应该是K.O.

也许有人可以帮助我?

【问题讨论】:

    标签: java eclipse jar testng main


    【解决方案1】:

    RegistrationTest 类:

    package nouguierc.selenium;
    
    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.Select;
    import org.testng.annotations.Test;
    
    public class RegistrationTest {
        public int a = 1;
    
        @Test
        public void testRegister() {
            WebDriver driver = null;
            try {
                System.setProperty("webdriver.chrome.driver", "C:\\Users\\nouguierc\\Desktop\\Projets\\Testing\\Airbus\\Automatisation\\testCélia\\WD_Automation\\chromedriver.exe");
                driver = new ChromeDriver();
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                driver.manage().window().maximize();
                driver.get("http://newtours.demoaut.com/");
                driver.findElement(By.linkText("REGISTER")).click();
                driver.findElement(By.name("firstName")).sendKeys("User1");
                driver.findElement(By.name("lastName")).sendKeys("Surname1");
                driver.findElement(By.name("phone")).sendKeys("123456789");
                driver.findElement(By.name("userName")).sendKeys("user1@test.com");
                driver.findElement(By.name("address1")).sendKeys("Test Address");
                driver.findElement(By.name("city")).sendKeys("Test City");
                Select select = new Select(driver.findElement(By.name("country")));
                select.selectByVisibleText("ANGOLA");
                driver.findElement(By.name("email")).sendKeys("user1@test.com");
                driver.findElement(By.name("password")).sendKeys("user1");
                driver.findElement(By.name("confirmPassword")).sendKeys("user1");
                driver.findElement(By.name("register")).click();
    
                if (a == 1)
                    System.out.println("OK");
                else
                    System.out.println("NOT OK");
                driver.quit();
            }
    
            catch (Exception e) {
                System.out.println(e.getMessage());
                driver.quit();
            }
        }
    }
    

    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>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>nouguierc.selenium.MainJar</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>nouguierc.selenium.MainJar</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>
    

    请用我刚才提供的文件替换你的这两个文件,并将主类命名为 MainJar

    【讨论】:

    • 阅读我提供的第一个答案的最后评论。
    • 有效吗?如果是,请接受结束此讨论的解决方案。
    【解决方案2】:

    您必须为 chromedriver 设置属性并将 chromedriver.exe 放在您的项目级别。

    要将它作为 jar 运行,您还必须创建一个主类:

    package com.stack.JarCreation;
    
    import org.testng.TestListenerAdapter;
    import org.testng.TestNG;
    
    public class Main {
    
        public static void main(String[] args) {
            TestListenerAdapter tla = new TestListenerAdapter();
            TestNG testng = new TestNG();
            testng.setTestClasses(new Class[] { RunnableJar.class });
            testng.addListener(tla);
            testng.run();
        }
    }
    

    package com.stack.JarCreation;
    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.Select;
    import org.testng.annotations.Test;
    
    public class RunnableJar {
        public int a = 1;
    
        @Test
        public void testRegister() {
            WebDriver driver=null;
            try {
                System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "\\chromedriver.exe");
                driver = new ChromeDriver();
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                driver.manage().window().maximize();
                driver.get("http://newtours.demoaut.com/");
                driver.findElement(By.linkText("REGISTER")).click();
                driver.findElement(By.name("firstName")).sendKeys("User1");
                driver.findElement(By.name("lastName")).sendKeys("Surname1");
                driver.findElement(By.name("phone")).sendKeys("123456789");
                driver.findElement(By.name("userName")).sendKeys("user1@test.com");
                driver.findElement(By.name("address1")).sendKeys("Test Address");
                driver.findElement(By.name("city")).sendKeys("Test City");
                Select select = new Select(driver.findElement(By.name("country")));
                select.selectByVisibleText("ANGOLA");
                driver.findElement(By.name("email")).sendKeys("user1@test.com");
                driver.findElement(By.name("password")).sendKeys("user1");
                driver.findElement(By.name("confirmPassword")).sendKeys("user1");
                driver.findElement(By.name("register")).click();
    
                if (a == 1)
                    System.out.println("OK");
                else
                    System.out.println("NOT OK");
                driver.quit();
            }
    
            catch (Exception e) {
                System.out.println(e.getMessage());
                driver.quit();
            }
        }
    }
    

    如果不是 maven 项目,请右键单击您的项目,然后转到 configure->convert to Maven project,将其转换为 maven 项目。

    并将您的 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>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>
    

    为启动配置创建 Jar 作为 Main-StackOverflow 并将 jar 和 chromedriver.exe 放在同一位置。

    【讨论】:

    • 谢谢你的回答,我会测试一下。但什么是 geckodriver ?我虽然它应该默认启动Firefox。
    • 我测试过了。我有错误:“Jar 导出完成但出现问题。查看详细信息无法从给定的启动配置中找到主要方法”。 MANIFEST.MF 不包含主类 (TestRunner)。我不明白为什么。在 jar 中,没有我的 main 方法,我的 TestSuite 和 RegistrationTest 也没有。
    • 如果您使用的是 Selenium 3,那么要使用 Firefox 浏览器,您需要使用单独的驱动程序来与 Firefox 浏览器交互。如果你注意到了,那么我们对 Chrome 和 IE 浏览器也做了同样的事情。
    • 你想创建一个 jar 并运行它还是在 eclipse 上运行它?您能否详细说明实际问题是什么,您能否附上带有上述代码的故障报告,因为它对我来说很好用。
    • 当我在 Eclipse 上运行 TestRunner 时它可以工作。但是当我导出可运行的 jar 并在 cmd 中写入 "java -jar "ExecutableJar.jar"" 时它不起作用。我编辑了我的帖子。
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2022-01-22
    • 2019-04-12
    相关资源
    最近更新 更多