Allure报告开发自定义插件

Allure报告开发自定义插件allure官网文档 https://docs.qameta.io/allure/alluregithub https://github.com/allure-framework/allure2当报告无法满足当前项目的需求,需要自定义内容来展示在报告中,即需要开发自己的自定义插件最终结果图:demo的结果是新增了一个MyTab目录栏,(demo未做有意义数据和css样式)…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

allure 官网文档 https://docs.qameta.io/allure/

allure github https://github.com/allure-framework/allure2

当报告无法满足当前项目的需求,需要自定义内容来展示在报告中,即需要开发自己的自定义插件

最终结果 图 :demo的结果是新增了一个My Tab 目录栏,(demo未做有意义数据和css样式)

Allure报告开发自定义插件

 

1.创建一个插件项目

  基本上插件项目包含2部分

java classess : 处理报告结果的类

Js script: 主要用于页面展示,widget或者一些额外的tab

典型目录

/my-plugin
    /src
        /dist
            /static
            allure-plugin.yml
        /main
            /java
                /my.company.plugin
    build.gradle

 src/dist/static  .js 和 .css 的文件

src/main/java  java代码

allure-plugin.yml  配置文件

id: my-plugin
name: Plugin name goes here
description: More detailed explanation of what does this plugin do.
extensions:
- my.company.allure.CustomPlugin // - Fully qualified names of classes that implement `Extension` interface and comprise data processing functionality.
- my.company.allure.CustomWidget
jsFiles:
- index.js
cssFiles:
- styles.css

我的目录结构

Allure报告开发自定义插件

 

增加 allure-plugin-api 依赖

我使用maven工程

   <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-plugin-api</artifactId>
            <version>${allureVersion}</version>
            <scope>provided</scope>
        </dependency>

到 https://mvnrepository.com/ 上找到最新版本的pom引用

 

2 写java类处理测试结果

    自定义插件类需要实现你需要的接口功能

   Aggregator 的aggregate  方法可以实现数据的提取处理,这里我把我想要的结果保存到myplugin.json文件内

   Widget 的getData  将数据填充到前端js内

package com.fengtai.allure.plugins;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import io.qameta.allure.Aggregator;
import io.qameta.allure.Widget;
import io.qameta.allure.context.JacksonContext;
import io.qameta.allure.core.Configuration;
import io.qameta.allure.core.LaunchResults;
import io.qameta.allure.entity.TestResult;

public class MyPlugin implements Aggregator, Widget {

	@Override
	public void aggregate(final Configuration configuration, final List<LaunchResults> launches,
			final Path outputDirectory) throws IOException {
		final JacksonContext jacksonContext = configuration.requireContext(JacksonContext.class);
		final Path dataFolder = Files.createDirectories(outputDirectory.resolve("data"));
		final Path dataFile = dataFolder.resolve("myplugindata.json");
		final Stream<TestResult> resultsStream = launches.stream().flatMap(launch -> launch.getAllResults().stream());
		try (OutputStream os = Files.newOutputStream(dataFile)) {
			jacksonContext.getValue().writeValue(os, extractData(resultsStream));
		}
	}

	private Collection<Map> extractData(final Stream<TestResult> testResults) {

		Collection<Map> collection = new ArrayList<Map>();
		List<TestResult> results = testResults.collect(Collectors.toList());
		for (TestResult rs : results) {
			try {
				collection.add(objectToMap(rs));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return collection;// TODO
	}

	@Override
	public Object getData(Configuration configuration, List<LaunchResults> launches) {
		// Stream<TestResult> filteredResults = launches.stream().flatMap(launch
		// -> launch.getAllResults().stream())
		// .filter(result -> result.getStatus().equals(Status.FAILED));
		Stream<TestResult> filteredResults = launches.stream().flatMap(launch -> launch.getAllResults().stream());
		return extractData(filteredResults);
	}

	/***
	 * 对象 转换成 map
	 */
	public static Map<String, Object> objectToMap(Object obj) throws Exception {
		if (obj == null)
			return null;

		Map<String, Object> map = new HashMap<String, Object>();

		BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
		PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor property : propertyDescriptors) {
			String key = property.getName();
			if (key.compareToIgnoreCase("class") == 0) {
				continue;
			}
			Method getter = property.getReadMethod();
			Object value = getter != null ? getter.invoke(obj) : null;
			map.put(key, value);
		}

		return map;
	}

	@Override
	public String getName() {
		return "mywidget";
	}
}

 

3. 在报告中添加一个新tab

   JS代码 index.js

var MyTabModel = Backbone.Collection.extend({
    url: 'data/myplugindata.json'
})

class MyLayout extends allure.components.AppLayout {

    initialize() {
        this.model = new MyTabModel();
    }

    loadData() {
        return this.model.fetch();
    }

    getContentView() {
        return new MyView({items: this.model.models});
    }
}

const template = function (data) {
    html = '<h3 class="pane__title">My Tab</h3>';
    for (var item of data.items) {
        html += '<p>' + item.attributes.name + ' says: ' + item.attributes.sounds + '</p>';
    }
    return html;
}
//在allure报告的左边增加一个tab按钮
var MyView = Backbone.Marionette.View.extend({
    template: template,

    render: function () {
        this.$el.html(this.template(this.options));
        return this;
    }
})

//
allure.api.addTab('mytab', {
    title: 'My Tab', icon: 'fa fa-trophy',
    route: 'mytab',
    onEnter: (function () {
        return new MyLayout()
    })
});

//wiget中展示
class MyWidget extends Backbone.Marionette.View {

    template(data) {
            return widgetTemplate(data)
    }

    serializeData() {
        return {
            items: this.model.get('items'),
        }
    }
}

allure.api.addWidget('mywidget', MyWidget);

4.打包插件

直接使用maven build jar包

插件存放路径,安装的allure 命令行 下的plugins文件夹,并且将 config下的allure.yml文件中增加自定义插件

Allure报告开发自定义插件

 

插件的开发和安装就已经完成了。

如何使用

使用命令,操作测试结果,并生成报告 generate的时候会调用插件功能 , open直接打开报告

allure generate ./allure-result -c

allure open ./allure-report

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164432.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Pycharm踩坑(一) FileNotFoundError: [Errno 2] No such file or directory: ‘../data/users.txt‘ 目录结构「建议收藏」

    Pycharm踩坑(一) FileNotFoundError: [Errno 2] No such file or directory: ‘../data/users.txt‘ 目录结构「建议收藏」Python使用Pycharm运行程序提示:FileNotFoundError:[Errno2]Nosuchfileordirectory:’../data/users.txt’目录结构test/├──data└──testcases└──test.py在test.py中运行代码:withopen(‘../data/users.txt’)asf…

  • shell中的for循环用法详解

    shell中的for循环用法详解for命令:foriin的各种用法:foriin“file1”“file2”“file3”foriin/boot/*foriin/etc/*.confforiin$(seq-w10)–》等宽的01-10foriin{1..10}foriin$(ls)forIin$(

  • python 元类编程_python定义元组

    python 元类编程_python定义元组前言通常我们创建类都是使用class类名,但是小伙伴们有没有想过,类是由谁来创建的呢,python中常说的万物皆对象,对象是由类创建的,那类本身也可以看做是对象,类可以由元类type创建type

  • 网站首页js幻灯片代码

    网站首页js幻灯片代码JS图片幻灯片,网站首页专用的图片特效代码,旅游网站用着最合适了,支持图片说明,每一幅图片都可以加标题和简短的文字介绍,右下角有图片切换控制按钮,示例中仅有5张图片,不过在实际应用中,你可以添加更多的图片。JS图片幻灯片*{margin:0;padding:0;}u

  • mac navicat premium15激活码【永久激活】[通俗易懂]

    (mac navicat premium15激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • idea 激活码 2022.01(注册激活)

    (idea 激活码 2022.01)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html40ZKSWCX8G-eyJsa…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号