Search code examples
allure

Trying to add a new Tab in Allure report


I'm trying to create a plugin for Allure, that will add a new tab called Browsers, that will display TC statuses across all browsers, but I'm stuck at the first step of it - adding Browsers Tab to the report itself. I was using allure-report-plugin-api and instructions from this question - Allure: How do I customize the test report to write "Browsers" instead of "Xunit"? and examples from the git repo of the allure-report-plugin-api. But I have no luck, the tab isn't added, despite the code being so simple. Could you, please, point me where I did mistakes and show me what is the correct way to do it? Big thanks in advance!

Here's an example how I'm trying to add the new tab

Here's the project structure

src
--->main
--->--->java
--->--->--->allure
--->--->--->--->(Class) BrowserInfo
--->--->resourses
--->--->--->(directory)allure
--->--->--->--->(directory)BrowserInfo
--->--->--->--->--->en.json
--->--->--->--->--->script.js
--->test
--->--->allure
--->--->--->(Class) GoogleSearchTest
--->--->testcases
--->--->--->SearchTest.xml
pom.xml

Here's BrowserInfo class

package allure;

import ru.yandex.qatools.allure.Allure;
import ru.yandex.qatools.allure.data.AllureAttachment;
import ru.yandex.qatools.allure.data.AllureStep;
import ru.yandex.qatools.allure.data.AllureTestCase;
import ru.yandex.qatools.allure.data.plugins.DefaultTabPlugin;
import ru.yandex.qatools.allure.data.plugins.Plugin;
import ru.yandex.qatools.allure.model.Label;

import java.util.ArrayList;
import java.util.List;

@Plugin.Name("browserList")
public class BrowserInfo extends DefaultTabPlugin {

    @Override
    public void process(AllureTestCase data) {

    }

}

Here's en.json

{
  "browserList": {
    "TITLE": "Browsers",
    "TITLE_FULL": "List of browsers"
  }
}

Here's script.js

/*global angular*/
(function() {
    "use strict";
    var module = angular.module('allure.browserList', []);
    module.config(function($stateProvider, allureTabsProvider) {
        allureTabsProvider.addTab('browserList', {title: 'browserList.TITLE'});
    });

})();

Here's just a little test

package allure;

import junit.framework.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

public class GoogleSearchTest {

    @Test
    public void searchBananasTest() {

        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.google.com/");
        driver.findElement(By.id("lst-ib")).sendKeys("BANANAS");
        driver.findElement(By.cssSelector("[type = 'submit']")).click();
        Assert.assertTrue(driver.findElement(
                By.cssSelector("[data-async-context='query:BANANAS'] h3")
        ).getText().toLowerCase().contains("banana"));
        driver.quit();

    }

}

Here's TestNG test xml for the test

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="searching bananas">

    <test name="searching bananas" preserve-order="true">
        <classes>
            <class name="allure.GoogleSearchTest">
                <methods>
                    <include name = "searchBananasTest"/>
                </methods>
            </class>
        </classes>
    </test>

</suite>

Here's pom.xml file

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

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <aspectj.version>1.8.5</aspectj.version>
    <allure.version>1.4.16</allure.version>
  </properties>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.16</version>
        <configuration>
          <suiteXmlFiles>
            <suiteXmlFile>${suitexml}</suiteXmlFile>
          </suiteXmlFiles>
          <testFailureIgnore>false</testFailureIgnore>
          <argLine>
            -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
          </argLine>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
          </dependency>
        </dependencies>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>

    <dependency>
      <groupId>ru.yandex.qatools.allure</groupId>
      <artifactId>allure-testng-adaptor</artifactId>
      <version>${allure.version}</version>
      <exclusions>
        <exclusion>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>2.46.0</version>
    </dependency>

    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.8.7</version>
    </dependency>

    <dependency>
      <groupId>ru.yandex.qatools.allure</groupId>
      <artifactId>allure-report-plugin-api</artifactId>
      <version>1.4.16</version>
    </dependency>

  </dependencies>

  <reporting>
    <excludeDefaults>true</excludeDefaults>
    <plugins>
      <plugin>
        <groupId>ru.yandex.qatools.allure</groupId>
        <artifactId>allure-maven-plugin</artifactId>
        <version>2.2</version>
      </plugin>
    </plugins>
  </reporting>

</project>

Solution

  • The main problem is that Allure loads plugins via Java SPI. So you need to create file ru.yandex.qatools.allure.data.plugins.Plugin in META-INF/services/ in your resources folder with the following content:

    allure.BrowserInfo
    

    Then you need to configure allure-maven-plugin to use your plugin:

    <reporting>
        <excludeDefaults>true</excludeDefaults>
        <plugins>
            <plugin>
                <groupId>ru.yandex.qatools.allure</groupId>
                <artifactId>allure-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <plugins>
                        <plugin>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>${project.artifactId}</artifactId>
                            <version>${project.version}</version>
                        </plugin>
                    </plugins>
                </configuration>
            </plugin>
        </plugins>
    </reporting>
    

    Note: the plugin should be installed to local repository.

    I recommend to use the separate project for your plugin and generate the preview report using maven-invoker-plugin. In this case you no need to run tests (you can just place test results to folder you need) and no need to install/deploy plugin.

    And few more comments for you:

    BrowserInfo

    By default Allure expects that each plugin provides some data in file ${pluginName}.json. So you need to add some dummy data. An example you can simple add field like this:

    @Plugin.Data
    private List<String> strings = new ArrayList<>();
    

    The other way configure this behavior in script.js (empty resolve section):

    allureTabsProvider.addTab('browserList', {title: 'browserList.TITLE', resolve: {}});
    

    Translation

    To add translation to the report use the following command:

    allureTabsProvider.addTranslation('cats');
    

    Take a look: Allure JavaScript API

    Plugin template

    Allure looks for tab.tpl.html for each tab plugin. So you need to add it to your plugin resources.

    I hope it helps.