Selenium Java(maven 项目):TestNG 结果与 ReportNG 不同

Posted

技术标签:

【中文标题】Selenium Java(maven 项目):TestNG 结果与 ReportNG 不同【英文标题】:Selenium Java (maven project): TestNG results differs from ReportNG 【发布时间】:2018-04-06 00:02:27 【问题描述】:

我尝试运行testng.xml,结果是:

================================================

默认测试

测试运行:14,失败:6,跳过:0

默认套件

运行的测试总数:14,失败:6,跳过:0

================================================

现在,我禁用了默认的 TestNG 侦听器,并在 testng.xml 中添加了 ReportNG 侦听器。 testng.xml。看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <listeners>
        <listener class-name="org.uncommons.reportng.htmlReporter" />
        <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
    </listeners>
    <test name="Test">
        <classes>
            <class name=".URL_Daily" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

按照步骤,我在maven的pom.xml中添加了velocityguicereportng依赖项。

在执行测试套件testng.xml 时,创建了以下文件夹(标记为红色框)。

打开index.html 后,结果如下:

正如预期的那样,ReportNG 应该已经创建了一个输出文件夹,这在我的场景中没有被注意到。其次,结果不同。

此外,报告index.html 看起来并不实际。谁能告诉我怎么了?

一些细节供您参考:

操作系统:Windows 7

Guice.jar 版本:guice-4.1.0

ReportNG 版本:reportng-1.1.4

Velocity 版本:velocity-dep-1.4

TestNG 版本:testng-6.11

Selenium 版本:selenium-java-3.5.3

Eclipse:eclipse oxygen

我的测试用例如下:

public class MwSites 
WebDriver driver;

@BeforeTest     
public void setup ()    

    System.setProperty("webdriver.chrome.driver", "F:\\Automation\\Drivers\\Selenium Drivers\\chromedriver_win32\\chromedriver.exe");
    ChromeOptions options = new ChromeOptions();
    options.addArguments("test-type");
    options.addArguments("start-maximized");
    options.addArguments("--js-flags=--expose-gc");  
    options.addArguments("--enable-precise-memory-info"); 
    options.addArguments("--disable-popup-blocking");
    options.addArguments("--disable-default-apps");
    options.addArguments("test-type=browser");
    options.addArguments("disable-infobars");
    driver = new ChromeDriver(options);
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);


@AfterTest
public void Quit () throws InterruptedException

    driver.quit();


@Test(priority = 0)     
public void MI_Demo () throws InterruptedException

    driver.navigate().to("http://demo.movingwalls.com/mi/#/login");
    Assert.assertEquals("Login", driver.getTitle());
    if (driver.getTitle()=="Login")
        System.out.println("Failed to access MI in demo environment");
    
    else
        System.out.println("MI is successfully accessed in demo environment");
    

【问题讨论】:

您是否已将 testng 执行配置为以自定义方式构建报告?最好是你分享你用于上述的配置。 我希望你当前的workspace is same作为共享目录。你也试过refreshing the folder? 是的,它是同一个工作区。认真地交叉检查和重新验证每一点配置。每次执行前都会刷新文件夹。 在这种情况下,您能否为此共享一个可重现的代码,并使用正在使用的库版本以及您正在测试的操作系统是否相关来更新问题。 @nullpointer 请求完成。我已经提到了使用的库版本。 【参考方案1】:

由于您的测试被跳过,您可能需要先检查测试结果 xml 以找出根本原因(异常)。

另一方面,我只是想知道使用一个没有维护 4 年的库的初衷是什么? ReportNG 已经死了。这是事实。如果您查看它的源代码,您会看到它使用的是哪个 TestNG 版本(6.8)。你可以很容易地假设它的报告器是基于旧的 TestNG API。

当您添加 TestNG 6.11 作为依赖项时,jar hell 发生的概率非常高。如果这是您问题的根本原因,我不会感到惊讶。

如果您还没有决定使用哪个报告系统,我建议您查看现代的Allure 2 框架。

否则,请先检查堆栈跟踪以了解问题的根本原因。

【讨论】:

使用 Allure 2 是另一种选择。感谢您的建议,但这并不能解决我的问题。根据管理层的要求,我只能使用 ReportNG。 @Sanchit 好的,但是您还没有发布任何堆栈跟踪。那么你希望人们如何猜测根本原因呢? 我没有收到任何错误。它对我有用,但结果不如预期。正如我上面解释的那样。如果有错误,我肯定会提供堆栈跟踪。 @Sanchit 据我所知,您预计会获得 8 个通过和 6 个失败的场景。当您添加 ReportNG 时,您有 14 个跳过的测试(这可能不是预期的,对吗?)。不能无故跳过测试。即使您在 html 报告中没有看到任何异常,它也肯定存在于test-output 文件夹中生成的测试结果 xml 文件之一中。所以我的建议是检查那些 xml 文件,并将相应的日志附加到原始帖子中,以帮助其他人找出问题的根本原因。【参考方案2】:

我能够使用指定的版本解决此问题。

默认情况下,ReportNG 报告是在surefire 插件配置的target/surefire-reports 文件夹下生成的。这可以通过surefire配置进行更改。

您可以添加任何测试类,但为了方便起见,我只包括 pom 文件和我使用过的两个示例类。

<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.rationaleemotions</groupId>
    <artifactId>46923243</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>46923243</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/velocity/velocity-dep -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.inject/guice -->
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>3.0</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.uncommons/reportng -->
        <dependency>
            <groupId>org.uncommons</groupId>
            <artifactId>reportng</artifactId>
            <version>1.1.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <!-- Suite testng xml file to consider for test execution -->
                    <suiteXmlFiles>
                        <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                    <properties>
                        <property>
                            <name>usedefaultlisteners</name>
                            <value>false</value>
                        </property>
                    </properties>
                </configuration>

            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>jcenter</id>
            <name>jcenter</name>
            <url>http://jcenter.bintray.com</url>
        </repository>
    </repositories>
</project>

我使用的测试类

package com.rationaleemotions;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.util.concurrent.TimeUnit;

public class MwSites 
    private WebDriver driver;

    @BeforeClass
    public void setup() 
        ChromeOptions options = new ChromeOptions();
        options.addArguments("test-type");
        options.addArguments("start-maximized");
        options.addArguments("--js-flags=--expose-gc");
        options.addArguments("--enable-precise-memory-info");
        options.addArguments("--disable-popup-blocking");
        options.addArguments("--disable-default-apps");
        options.addArguments("test-type=browser");
        options.addArguments("disable-infobars");
        driver = new ChromeDriver(options);
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    

    @AfterClass
    public void Quit() throws InterruptedException 
        driver.quit();
    

    @Test
    public void MI_Demo() throws InterruptedException 
        driver.navigate().to("http://demo.movingwalls.com/mi/#/login");
        Assert.assertEquals("Login", driver.getTitle());
        if ("Login".equals(driver.getTitle())) 
            System.out.println("Failed to access MI in demo environment");
         else 
            System.out.println("MI is successfully accessed in demo environment");
        
    

package com.rationaleemotions;

import org.testng.Assert;
import org.testng.Reporter;
import org.testng.annotations.Test;

public class TestClassWithMultipleResults 
    @Test
    public void testMethodWillPass() 
        Reporter.log("This test method will pass", true);
    

    @Test
    public void testMethodWillFail() 
        Reporter.log("This test method will fail", true);
        Assert.fail();
    

    @Test(dependsOnMethods = "testMethodWillFail")
    public void testMethodWillSkip() 
    

我使用的套件 xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <listeners>
        <listener class-name="org.uncommons.reportng.HTMLReporter"/>
        <listener class-name="org.uncommons.reportng.JUnitXMLReporter"/>
    </listeners>
    <test name="Test">
        <classes>
            <class name="com.rationaleemotions.MwSites"/>
            <class name="com.rationaleemotions.TestClassWithMultipleResults"/>
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

以下是 ReportNG 报告的屏幕截图

【讨论】:

我能够使用指定的版本解决此问题不确定您更改了什么? @nullpointer - 这取决于用于设置类路径的内容。我用过 Maven。 好吧,关键是如果您认为类路径规范可能是原因,您应该将其作为注释指出(如果要确认),或者说明原因的详细信息。只是重复问题的内容似乎是抄袭。 @nullpointer - 我会让 OP 决定答案是否抄袭。

以上是关于Selenium Java(maven 项目):TestNG 结果与 ReportNG 不同的主要内容,如果未能解决你的问题,请参考以下文章

Selenium Java(maven 项目):TestNG 结果与 ReportNG 不同

cumber + selenium +java自动化测试

Selenium+Maven+Jenkins+testNg自动生成测试报告

Selenium 自动化组织项目

selenium第一课(selenium+java+testNG+maven)

Selenium-TestNG-Maven - 获取“java.lang.NoClassDefFoundError:org/openqa/selenium/firefox/FirefoxDriver”