其实大多数的时候我们的测试报告的发送可能都是结合Jenkins发送的,所以这方面更多的都是依赖于它,可是如果有的时候我们不需要Jenkins的时候,我们应该如何去处理这部分的内容呢
由于我们使用的是maven,所以我们主要来看看pom.xml的情况
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<executions>
<execution>
<goals>
<goal>testgoal>
goals>
execution>
executions>
<version>2.19version>
<configuration>
<properties>
<property>
<name>usedefaultlistenersname>
<value>falsevalue>
property>
<property>
<name>listenername>
<value>org.uncommons.reportng.HTMLReporter,org.uncommons.reportng.JUnitXMLReportervalue>
property>
properties>
<suiteXmlFiles>
<suitXmlFile>testSuits/seewotraining.xmlsuitXmlFile>
suiteXmlFiles>
<reportsDirectory>./target/${timestamp}reportsDirectory>
<systemPropertyVariables>
<org.uncommons.reportng.escape-output>falseorg.uncommons.reportng.escape-output>
systemPropertyVariables>
configuration>
plugin>
maven-surefire-plugin 这个插件主要是用于testng的。我们通过该插件,在对应的目录下./target/${timestamp}
生成我们的测试报告目录。我们可以看到这个目录的结构。
这里实际上就是reportng的测试报告的生成路径。但是我们想要通过邮件发送会很难,因为html的内容需要加在额外的css,以及js文件。而邮件实际上是不支持外部的css以及js文件的。
所以就需要我们自己想办法来,既然这样子那我们就自己写一个html就可以了。那么我们要怎么才能够知道测试结果的情况呢,我们可以从这个文件里面获取到TEST-TestSuit.xml
我们可以看看这个xml的内容
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" name="TestSuite" time="78.567" tests="2" errors="0" skipped="0" failures="2">
<properties>
<property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
<property name="sun.boot.library.path" value="C:\Program Files\Java\jdk1.8.0_11\jre\bin"/>
<property name="java.vm.version" value="25.11-b03"/>
<property name="java.vm.vendor" value="Oracle Corporation"/>
<property name="maven.multiModuleProjectDirectory" value="E:\eclipseProject\SeewoTraining"/>
<property name="java.vendor.url" value="http://java.oracle.com/"/>
<property name="sun.cpu.isalist" value="amd64"/>
properties>
<testcase name="login" classname="com.seewo.training.TestSeewoTraining" time="60.103">
<failure message="Timed out after 30 seconds waiting for visibility of Proxy element for: DefaultElementLocator 'By.xpath: //*[@id='username']'
Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46'
System info: host: 'cvtpc-PC', ip: '127.0.0.1', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_11'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={chromedriverVersion=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), userDataDir=C:\Users\cvtpc\AppData\Local\Temp\scoped_dir31352_25457}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=47.0.2526.106, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: c0c126ea4d4db0e1c3e2ca8352645830" type="org.openqa.selenium.TimeoutException">org.openqa.selenium.TimeoutException:
failure>
testcase>
<testcase name="login2" classname="com.seewo.training.TestSeewoTraining" time="11.999">
<failure type="java.lang.NullPointerException">java.lang.NullPointerException
at com.seewo.training.TestSeewoTraining.login2(TestSeewoTraining.java:25)
failure>
<system-out>system-out>
testcase>
testsuite>
以上的内容我删除掉了部分property的内容。从这里我们就可以通过
的标签来识别出是有一条测试用例,并且通过
是否存在来判断这条测试用例是成功还是失败的。
下来看看我们生成html的代码吧。
/**
* 判断字符串中是否包含数字
* @param content 查找的字符串
* @return 是否包含
*/
public static boolean hasDigit(String content) {
boolean flag = false;
Pattern p = Pattern.compile(".*\\d+.*");
Matcher m = p.matcher(content);
if (m.matches())
flag = true;
return flag;
}
/**
* 获取到最新的目录
* @return 返回目录的名称
*/
private static String getLastesFolder() {
File path=new File("./target/");
//列出该目录下所有文件和文件夹
File[] files = path.listFiles();
//按照文件最后修改日期倒序排序
Arrays.sort(files, new Comparator() {
@Override
public int compare(File file1, File file2) {
return (int)(file2.lastModified()-file1.lastModified());
}
});
//取出第一个(即最新修改的)文件,打印文件名
for (File file : files) {
System.out.println(file.getName());
if (hasDigit(file.getName())) {
return file.getName();
}
}
return files[0].getName();
}
/**
* 读取Suite.xml文件
* @return 对应的html内容
*/
public static String readSuitsXml() {
XmlParser xmlParser = new XmlParser("./target/"+getLastesFolder()+"/TEST-TestSuite.xml");
List elements = xmlParser.getElementsByTag(xmlParser.getRootElement(), "testcase");
int testCasePass = 0, testCaseFail = 0, testCaseSkip = 0;
for (Object element1 : elements) {
Element element = (Element) element1;
if (xmlParser.getElementByTag(element, "failure") == null) {
baseHtml += "" + xmlParser.
getElementByAttr(element, "name") + "\n";
testCasePass += 1;
}else {
baseHtml += "" + xmlParser.
getElementByAttr(element, "name") + "\n";
testCaseFail += 1;
}
}
baseHtml +="\n" +
"
\n" + "