【问题标题】:TestNG's @Test annotation not executed properly with the mvn commandTestNG 的 @Test 注释未使用 mvn 命令正确执行
【发布时间】:2022-02-03 09:27:33
【问题描述】:

任何带有@Test 注解的东西都会抛出空指针异常,不管调用的是什么方法。我尝试调用 driver.findElement() 并使用 JavascriptExecutor 执行 js 脚本。两种方法都以空指针结束。 如果我通过 IDE 运行,一切都会像魅力一样工作。否则,只有 Before 和 After 注释被充分执行 这是我的 pom.xml:

   <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">

<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.9</version>
            <configuration>
                <parallel>methods</parallel>
                <threadCount>1</threadCount>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.1.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.testng/testng -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.5</version>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.10</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache-extras.beanshell</groupId>
        <artifactId>bsh</artifactId>
        <version>2.0b6</version>
    </dependency>
</dependencies>

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

 </project>

和 testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Practice Suite">
<test name="Test Basics 1">

    <method-selectors>
        <method-selector>
            <script language="beanshell">
                <![CDATA[
                String testGroup = System.getProperty("env");
                groups.containsKey(testGroup);
            ]]>
            </script>
        </method-selector>
    </method-selectors>
    
    <classes>
        <class name="tests.SignUpTest"/>
    </classes>
</test>

 </suite>

最后是我用来运行测试的两种方式:

mvn -Dwebdriver=chrome -Denv=qa install

mvn -Dwebdriver=chrome -Denv=qa test

编辑:

测试前和测试:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;

public class BaseTest {


protected  WebDriver driver;

private WebDriver selectDriver(String driver)

    switch (driverString) {
        case "chrome":
            return new ChromeDriver();
        case "firefox":
            return new FirefoxDriver();
        case "edge":
            return new EdgeDriver();
        case "safari":
            return new SafariDriver();
        default:
            return new ChromeDriver();
    }
    
}

     @BeforeTest(alwaysRun = true)
    public void testInit() {

        driver = selectDriver(System.getProperty("webdriver"));

    }

}

import additions.BaseTest;
import org.testng.Assert;
import org.testng.annotations.Test;
import pages.DashBoardPage;
import pages.LoginPage;


public class LoginTest extends BaseTest {

@Test
public void successfulLogin(){
    LoginPage loginPage = new LoginPage(driver);

    loginPage
            .populateUserName("somename")
            .populatePassword("somepassowrd")
            .clickLoginButton();

}

}

【问题讨论】:

  • 请升级maven-surefire-plugin的版本,因为它是至少2.22.2的旧版本...
  • 完成,但问题仍然存在。
  • 我有个线索。看来 Test 注释是在 BeforeTest 之前执行的。
  • 请出示一个测试用例....
  • 我已经编辑了我的帖子。请看一看。我试图让它比现在更整洁。希望它是可读的

标签: java selenium maven testng


【解决方案1】:

由于问题仍然存在一些不确定性,我将尝试分享我的想法。

如果我通过 IDE 运行,一切都会像魅力一样运行。

有几种方法可以在 IDE 中运行它:

  1. 运行测试类。

    在这种情况下,IDE 生成自己的 testng.xml 与示例不匹配(来自问题),因此它不会包含任何 method-selector 项目。

  2. 运行 testng.xml

    testng.xml 中有method-selector,它期望提供System.getProperty("env")。 如果您从 IDE 运行 testng.xml,则必须通过 IDE 设置以某种方式提供
    System.getProperty("env"),否则您将看到org.testng.TestNGException: javax.script.ScriptException 错误。


如果我查看testng.xml,我会看到method-selector,它通过System.getProperty("env") 过滤测试。

如果我看一下测试:

@Test
public void successfulLogin(){
    LoginPage loginPage = new LoginPage(driver);

我没有看到任何为它定义的组。所以这个测试不能用 maven 命令执行。而且还不清楚它是如何引发任何异常的。


如果我查看 maven 命令

mvn -Dwebdriver=chrome -Denv=qa test

我看不到定义要执行哪个 testng xml 套件的参数。

我希望这样的命令:

mvn test -Dwebdriver=chrome -Denv=qa -Dsurefire.suiteXmlFiles="src/test/resources/tests.xml"

预期行为

当我们执行maven命令时:

mvn test -Dwebdriver=chrome -Denv=qa -Dsurefire.suiteXmlFiles="src/test/resources/tests.xml"

testng.xml 中的方法选择器查找与qa 组匹配的方法。

并且没有任何方法,匹配这个组

但是alwaysRun = true有一些配置方法,无论如何都会执行

所以

 @BeforeTest(alwaysRun = true)
    public void testInit() {

在没有任何测试的情况下调用,

输出将是:

[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.345 s - in TestSuite
[INFO] 
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.867 s

如果我们添加组,测试将被执行:

@Test(groups= {"qa"})
public void successfulLogin(){

【讨论】:

  • 感谢您的回答。我实际上确实有带有“qa”的组,它们在使用 IDE 运行 testng.xml 文件时工作。星期一,我将尝试使用您回答中的信息来修复它,我会更新您。再次感谢。
  • 我在 IntelliJ 的配置窗口的 VM 选项字段中传递了 -Dwebdriver 和 -Denv。在同一个窗口中,我将测试类型更改为“套件”,现在即使从 IDE 构建也失败了。请记住,我设置了套件的完整路径,但它仍然失败。我想这又是一个线索。我会尝试修复它,但如果你想出解决方案,请告诉我。
  • 实际上这对我有用:mvn test -Dwebdriver=chrome -Denv=qa -Dtest=SignUpTest.java 现在我正试图弄清楚如何为一个包而不是单个测试类做到这一点。
  • 还是不行,但我会处理的。感谢大家的大力帮助
【解决方案2】:

我已经解决了。事实证明,使用@BeforeTest 注解初始化驱动程序并不是一个好主意,尤其是当您的拆卸方法标记有@AfterTest 时。驱动程序在第一个 @Test 方法中被初始化并正确使用,但在第二个方法中,已经调用了 teardown 方法并且驱动程序变为空。所以我使用了@BeforeClass 和@AfterClass(我可能会重新考虑并使用@Before/AfterSuite)。然后我在 pom.xml 中添加了如下配置

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
             
                <suiteXmlFiles>
                    <suiteXmlFile>testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
    </plugins>
</build>

然后我在 testng.xml 文件中添加了包含我想要执行的测试的包,如下所示:

        <packages>
        <package name="path.to.tests.*"></package>
    </packages>

最后我使用以下语法调用了 mvn 命令:

mvn test -Dsurefire.suiteXmlFiles=testng.xml  -Dwebdriver="chrome" -Denv="qa"

这样你就不必调用testng.xml文件的路径,而是从pom.xml中调用它。作为最后一句的旁注,我的 testng.xml 文件与 src 文件夹一起位于项目目录中。如果你把它放在另一个文件夹中,我想在 pom.xml 中设置这个文件夹的路径会很好

我希望这是可以理解的,并且对遇到此类问题的任何人都有帮助。

再次感谢其他人提供线索。

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2022-01-14
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多