Appium ReportNG 手把手教你弄测试报告

testly · 2015年03月13日 · 最后由 Anson 回复于 2020年09月14日 · 5342 次阅读
本帖已被设为精华帖!

ReportNG 是一个配合 TestNG 运行 case 后自动帮你在 test-output 文件内生成一个相对较为美观的测试报告!
ReportNG 里面 Log 是不支持中文的,我改过 ReportNG.jar 源码,具体方法看最下面,也可以找我直接要 jar!
话不多说直接上

环境准备:
1,你需要这些架包

解释:有人会问现在 ReportNG 版本不是 1.1.4 吗?为什么我这里是 1.1.5 呢,这里是因为我改过这里面的源码,(为什么要改源码?后面告诉你)
修复 ReportNG 中文乱码问题包下载地址:地址
2,先写一个简单的 case,比如打开百度,下面这个代码看上去不难吧!这是第二步前提是你能运行它

package Test;
import org.junit.After;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.Test;


public class case1 {

    WebDriver driver;

    @Test
    public void Open() throws InterruptedException 
    {

        System.setProperty("webdriver.friefox.bin","C:\\Program Files\\Mozilla Firefox\\friefox.exe");

        FirefoxProfile fp = new FirefoxProfile();
        WebDriver driver = new FirefoxDriver(fp);
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys("testerhome");

    }


        @Test
    public void Open() throws InterruptedException 
    {

        System.setProperty("webdriver.friefox.bin","C:\\Program Files\\Mozilla Firefox\\friefox.exe");

        FirefoxProfile fp = new FirefoxProfile();
        WebDriver driver = new FirefoxDriver(fp);
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys("testerhome");
        Reporter.log("测试1通过");

    }


    @Test
    public void Open1() throws InterruptedException 
    {

        System.setProperty("webdriver.friefox.bin","C:\\Program Files\\Mozilla Firefox\\friefox.exe");

        FirefoxProfile fp = new FirefoxProfile();
        WebDriver driver = new FirefoxDriver(fp);
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys("testerhome");
        Reporter.log("测试2通过");

    }


    @Test
    public void Open2() throws InterruptedException 
    {

        System.setProperty("webdriver.friefox.bin","C:\\Program Files\\Mozilla Firefox\\friefox.exe");

        FirefoxProfile fp = new FirefoxProfile();
        WebDriver driver = new FirefoxDriver(fp);
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("k1w")).sendKeys("testerhome");
        Reporter.log("测试3通过");

    }


    @After

    public void quit() throws InterruptedException 
    {


        driver.quit();

    }

}

3,配置 testNG.xml,这个文件是 testNG 的配置文件,

<?xml version="1.0" encoding="UTF-8"?>
<suite name="test" parallel="true">

<test name="test" preserver-order="true">
<classes>
//你也可以多个
<class name="包名.case名字"/>
<class name="包名.case名字"/>
<class name="包名.case名字"/>
</classes>

<listeners>
//这是你需要加的东西
<listener class-name="org.uncommons.reportng.HTMLReporter" />
<listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
</listeners>
</test> <!-- Test -->
</suite> <!-- Suite -->

4,然后运行 testNG.XML ,再看 test-output 文件夹 里面的 html 文件下面的 index.html

报错信息:

你自己 System.out 的东西都可以写到这里:


如果你的报告是乱码,那么你不要急,方法在下面:

在使用 ReportNG 替换 TestNG 自带报告时如果报告中含中文,则会乱码,很是不爽,所以把 ReportNG 的源码下载下来调试。

原来以为是 velocity 模板的问题,结果对比发现模板没有任何问题,再通过跟踪生成报告过程的代码发现是在将模板文件替换后输出到页面时未转码导致的,修改方法如下:

修改 AbstractReporter 中的 generateFile 这个方法中的代码如下:
现在是这样的:


protected void generateFile(File file,
                                String templateName,
                                VelocityContext context) throws Exception
    {
        Writer writer = new BufferedWriter(new FileWriter(file));
        try
        {
            Velocity.mergeTemplate(classpathPrefix + templateName,
                                   ENCODING,
                                   context,
                                   writer);
            writer.flush();
        }
        finally
        {
            writer.close();
        }
    }

修改成下面这样,然后编译好新的 jar 文件


protected void generateFile(File file,
                                String templateName,
                                VelocityContext context) throws Exception
    {
        //Writer writer = new BufferedWriter(new FileWriter(file)); 
        //encoding to utf-8
        OutputStream out=new FileOutputStream(file);
        Writer writer = new BufferedWriter(new OutputStreamWriter(out,"utf-8"));
        try
        {
            Velocity.mergeTemplate(classpathPrefix + templateName,ENCODING,context,writer);

            writer.flush();
        }
        finally
        {
            writer.close();
        }
    }

这样生成的报告就不会乱码了。

改造过的 架包:
https://yunpan.cn/ckgZ9Sx7GZ7nt(提取码:e2f9)如果失效可以去我的公众号上获取~那边会实时更新

欢迎一起交流,一起进步 可以关注我的微信公众号:

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 40 条回复 时间 点赞

赞一个,学习

done,回头将公司丑比的报告换掉

赞一个

<property>
    <name>userdefaultlisteners</name>
    <value>false</value>
</property>

这个属性要加上吧,禁用 testng 自带的 listener

赞一个,挺不错的!

先赞一个,后学习;)

非常好

楼主分享的是 webdriver 吧 还以为是 appium 也能配合 reportng 出测试报告了~

#7 楼 @tianying可以出的

@testly 想请教下为什么我修改 reportNG 的源码后重新打 jar 结果总是打出空的包。提示是这个
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for org.uncommons:reportng:jar:1.1.5
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 36, column 9
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]

[INFO] ------------------------------------------------------------------------
[INFO] Building ReportNG 1.1.5
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ reportng ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\workspace\reportng\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ reportng ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ reportng ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\workspace\reportng\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ reportng ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ reportng ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ reportng ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.829 s
[INFO] Finished at: 2015-05-19T17:49:09+08:00
[INFO] Final Memory: 10M/155M
[INFO] ------------------------------------------------------------------------

testly #10 · 2015年05月19日 Author

#9 楼 @wang04170 直接导出 jar 好了

楼主来个 appium+ReportNG 手把手教你弄测试报告 整合半天了 卡住了

testly #12 · 2015年05月22日 Author

#11 楼 @qing510 有问题发帖来问,其实 appium+reportNg 也是一样的

终于找到想要的资料了,学习收藏了。

顶顶顶!!!!

好东西,收藏

#12 楼 @testly
楼主你好 为什么我的每次执行完用例后要报错 浏览器能正常打开 用例能执行完毕 原来生成过报告,现在不能生成了,请指点
java.lang.NoClassDefFoundError: com/google/inject/Module
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetPublicMethods(Unknown Source)
at java.lang.Class.getMethods(Unknown Source)
at org.apache.velocity.util.introspection.ClassMap.getAccessibleMethods(ClassMap.java:258)
at org.apache.velocity.util.introspection.ClassMap.populateMethodCache(ClassMap.java:151)
at org.apache.velocity.util.introspection.ClassMap.(ClassMap.java:64)
at org.apache.velocity.util.introspection.IntrospectorBase.createClassMap(IntrospectorBase.java:126)
at org.apache.velocity.util.introspection.IntrospectorBase.getMethod(IntrospectorBase.java:112)
at org.apache.velocity.util.introspection.Introspector.getMethod(Introspector.java:100)
at org.apache.velocity.runtime.parser.node.PropertyExecutor.discover(PropertyExecutor.java:65)
at org.apache.velocity.runtime.parser.node.PropertyExecutor.(PropertyExecutor.java:39)
at org.apache.velocity.util.introspection.UberspectImpl.getPropertyGet(UberspectImpl.java:156)
at org.apache.velocity.runtime.parser.node.ASTIdentifier.execute(ASTIdentifier.java:125)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:175)
at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:327)
at org.apache.velocity.runtime.parser.node.ASTAddNode.value(ASTAddNode.java:66)
at org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:51)
at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:95)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:55)
at org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:166)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:114)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:55)
at org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:166)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:114)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:230)
at org.apache.velocity.Template.merge(Template.java:256)
at org.apache.velocity.app.Velocity.mergeTemplate(Velocity.java:449)
at org.uncommons.reportng.AbstractReporter.generateFile(AbstractReporter.java:114)
at org.uncommons.reportng.HTMLReporter.createOverview(HTMLReporter.java:143)
at org.uncommons.reportng.HTMLReporter.generateReport(HTMLReporter.java:108)
at org.testng.TestNG.generateReports(TestNG.java:1115)
at org.testng.TestNG.run(TestNG.java:1074)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Caused by: java.lang.ClassNotFoundException: com.google.inject.Module
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 36 more

#16 楼 @nancy2896 用基础版的 testng.xml 没有错

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
    <test name="test_testNG">
        <classes>
            <class name="testNG_test.test_testNG" />
        </classes>
    </test>
</suite>

现在用的 xml 如下

<?xml version="1.0" encoding="UTF-8"?>
<suite name="test" parallel="true">

<test name="test" preserver-order="true">
<classes>

 <class name="testNG_test.test_testNG" />

</classes>

<listeners>

<listener class-name="org.uncommons.reportng.HTMLReporter" />
<listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
</listeners>
</test> <!-- Test -->
</suite> <!-- Suite -->

#16 楼 @nancy2896 自己解决了 是缺少 jar 包导致的 自己网上下载了一个 guice-3.0.zip,然后倒入工程后执行成功了 生成了期待的测试报告

求指导怎么把源码 build 成 JAR,我从https://github.com/dwdyer/reportng.gitmaven 工程导入 eclipse弄的源码,选择

中文乱码问题,手动改下浏览器的文字编码就可以了吧

梁慧玲 [该话题已被删除] 中提及了此贴 07月01日 10:01

我看到我的都是中文乱码时好方,用你这个就解决问题了,非常感谢~~

testly #23 · 2016年07月29日 Author

#22 楼 @ping_sky 很高兴能帮到你

楼主,导入包之后直接 run - testng.xml 会自动美化报告吗。jar 能给我一份吗,谢谢 461402526@qq.com

楼主可以给一个修改后的 jar 包吗谢谢 。497703927@qq.com

testly #26 · 2016年09月09日 Author

#25 楼 @sysayy 我把下载地址给到文章的最上面了

#27 楼 @sysayy 还有 我想问下楼主下载下来的 reportng 源码是导入 maven 导入吗 ? 修改后 如何打成 jar 包文件那 ?

testly #29 · 2016年09月09日 Author

#28 楼 @sysayy 这个步骤网上都有的,你去搜搜看吧

#29 楼 @testly 找了网上的步骤后,用 mvn assembly:assembly 打出来的包竟然 17M 多,直接 eclipse 导出 jar 包的方式提示没有 main 方法 求楼主分享导入修改源码 打包的过程

下载了楼主的 jar 包,为什么我导入用不了呢??就是 run testng.xml 后还是原来的报告的样子

testly #32 · 2016年10月13日 Author

#31 楼 @xiaoxiao6 确认你 testng.xml 加了 listeners

导入了下载下来的 jar,testng.xml 也配置了,出来的报告还是原来的样子,为啥

ava.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:459)
at java.util.Properties.setProperty(Properties.java:166)
at org.testng.reporters.JUnitXMLReporter.generateReport(JUnitXMLReporter.java:163)
at org.testng.reporters.JUnitXMLReporter.onFinish(JUnitXMLReporter.java:118)
at org.testng.TestRunner.fireEvent(TestRunner.java:1246)
at org.testng.TestRunner.afterRun(TestRunner.java:1039)
at org.testng.TestRunner.run(TestRunner.java:621)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
at org.testng.TestNG.run(TestNG.java:1031)

请问这个是说报告的地址设置的不对吗

感谢分享,乱码问题解决啦

我按照你的方法修改了一下源码,把源码的 maven 工程生成 jar 包后,导入运行报错啊

楼主,能提供一下修改后的 jar 包吗,我用官方的 reportng 的 jar 包生成的报告是没有任何格式的,你现在给的链接没用了啊

testly #38 · 2017年01月19日 Author

#37 楼 @wangbin 少了架包

曾晖斌 修改 ReportNG 开源项目的一些问题 中提及了此贴 10月17日 14:56

先给楼主赞一个,再者想问下,有没有相同的支持 python 生成这种报告的工具呢

wuliguaiguai 回复

我也遇到了同样的问题,生成的 jar 包也导入了,你最后怎么解决的呢

Baozhida [该话题已被删除] 中提及了此贴 02月28日 14:49

修改 AbstractReporter 中的 generateFile 这个方法,用 Ant 重现打包,但乱码还是有,但 jar 包其他修改都生效了。奇怪~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册