<!DOCTYPE doctype html> <html lang="en"> <head> <link href="https://img.icons8.com/flat_round/64/000000/bar-chart.png" rel="shortcut icon" type="image/x-icon"/> <title> TestNG Metrics Report</title> <meta charset="utf-8"/> <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/> <meta content="width=device-width, initial-scale=1" name="viewport"/> <link href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet"/> <link href="https://cdn.datatables.net/buttons/1.5.2/css/buttons.dataTables.min.css" rel="stylesheet"/> <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/> <script src="https://code.jquery.com/jquery-3.3.1.js" type="text/javascript"></script> <!-- Bootstrap core Googleccharts --> <script src="https://www.gstatic.com/charts/loader.js" type="text/javascript"></script> <script type="text/javascript"> google.charts.load('current', {packages: ['corechart']}); </script> <!-- Bootstrap core Datatable--> <script src="https://code.jquery.com/jquery-3.3.1.js" type="text/javascript"></script> <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js" type="text/javascript"></script> <script src="https://cdn.datatables.net/buttons/1.5.2/js/dataTables.buttons.min.js" type="text/javascript"></script> <script src="https://cdn.datatables.net/buttons/1.5.2/js/buttons.flash.min.js" type="text/javascript"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js" type="text/javascript"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js" type="text/javascript"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js" type="text/javascript"></script> <script src="https://cdn.datatables.net/buttons/1.5.2/js/buttons.html5.min.js" type="text/javascript"></script> <script src="https://cdn.datatables.net/buttons/1.5.2/js/buttons.print.min.js" type="text/javascript"></script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-128252886-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-128252886-1'); </script> <style> .sidebar { position: fixed; top: 0; bottom: 0; left: 0; z-index: 100; /* Behind the navbar */ box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); } .sidebar-sticky { position: relative; top: 0; height: calc(100vh - 48px); padding-top: .5rem; overflow-x: hidden; overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ } @supports ((position: -webkit-sticky) or (position: sticky)) { .sidebar-sticky { position: -webkit-sticky; position: sticky; } } .sidebar .nav-link { color: black; } .sidebar .nav-link.active { color: #007bff; } .sidebar .nav-link:hover .feather, .sidebar .nav-link.active .feather { color: inherit; } [role="main"] { padding-top: 8px; } /* Set height of body and the document to 100% */ body { height: 100%; margin: 0; //font-family: Comic Sans MS; background-color: white; } /* Style tab links */ .tablinkLog { cursor: pointer; } @import url(https://fonts.googleapis.com/css?family=Droid+Sans); .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: url('http://www.downgraf.com/wp-content/uploads/2014/09/01-progress.gif?e44397') 50% 50% no-repeat rgb(249,249,249); } /* TILES */ .tile { width: 100%; float: left; margin: 0px; list-style: none; font-size: 40px; color: #FFF; -moz-border-radius: 5px; -webkit-border-radius: 5px; margin-bottom: 5px; position: relative; text-align: center; color: white!important; } .tile.tile-fail { background: #f44336!important; } .tile.tile-pass { background: #4CAF50!important; } .tile.tile-info { background: #009688!important; } .tile.tile-head { background: #ff6f69!important; } .dt-buttons { margin-left: 5px; } </style></head> <body> <div class="loader"></div> <div class="container-fluid"> <div class="row"> <nav class="col-md-2 d-none d-md-block bg-light sidebar" style="font-size:16px;"> <div class="sidebar-sticky"> <ul class="nav flex-column"> <img src="https://cdn.pixabay.com/photo/2016/08/02/10/42/wifi-1563009_960_720.jpg" style="height:18vh!important;width:95%;"/> <br/> <h6 class="sidebar-heading d-flex justify-content-between align-items-center text-muted"> <span>Metrics</span> <a class="d-flex align-items-center text-muted" href="#"></a> </h6> <li class="nav-item"> <a class="tablink nav-link" href="#" id="defaultOpen" onclick="openPage('dashboard', this, 'orange')"> <i class="fa fa-dashboard"></i> Dashboard</a> </li> <li class="nav-item"> <a class="tablink nav-link" href="#" onclick="openPage('classMetrics', this, 'orange');executeDataTable('#cm',3)"> <i class="fa fa-list-alt"></i> Class Metrics</a> </li> <li class="nav-item"> <a class="tablink nav-link" href="#" onclick="openPage('testMetrics', this, 'orange');executeDataTable('#tm',3)"> <i class="fa fa-table"></i> Test Metrics</a> </li> <li class="nav-item"> <a class="tablink nav-link" href="#" onclick="openPage('methodMetrics', this, 'orange');executeDataTable('#mm',3)"> <i class="fa fa-table"></i> Method Metrics</a> </li> <li class="nav-item"> <a class="tablink nav-link" href="#" onclick="openPage('log', this, 'orange');"> <i class="fa fa-wpforms"></i> TestNG Logs</a> </li> <li class="nav-item"> <a class="tablink nav-link" href="#" onclick="openPage('statistics', this, 'orange');"> <i class="fa fa-envelope-o"></i> Email Metrics</a> </li> </ul> </div> </nav> </div> </div> <div class="col-md-9 ml-sm-auto col-lg-10 px-4" role="main"> <div class="tabcontent" id="dashboard"> <div class="d-flex flex-column flex-md-row align-items-center p-1 mb-3 bg-light border-bottom shadow-sm"> <h5 class="my-0 mr-md-auto font-weight-normal"><i class="fa fa-dashboard"></i> Dashboard</h5> <nav class="my-2 my-md-0 mr-md-3" style="color:red"> <a class="p-2"><b data-toggle="tooltip" style="color:black;cursor: pointer;" title=".xml file is created by"> Generated By:</b> TestNG</a> </nav> </div> <div class="row"> <div class="col-md-3"><a class="tile tile-info">10<p style="font-size:15px">Total Tests</p></a></div> <div class="col-md-3"><a class="tile tile-pass">5<p style="font-size:15px">Pass</p></a></div> <div class="col-md-3"><a class="tile tile-fail">2<p style="font-size:15px">Fail</p></a></div> <div class="col-md-3"><a class="tile tile-head">3<p style="font-size:15px">Skip</p></a></div> </div><hr/> <div class="row"> <div class="col-md-4" style="background-color:white;height:350px;width:auto;border:groove;"> <span style="font-weight:bold">Test Status:</span> <div id="testChartID" style="height:300px;width:auto;"></div> </div> <div class="col-md-8" style="background-color:white;height:350px;width:auto;border:groove;"> <span style="font-weight:bold">Top 5 Class Failures:</span> <div id="classBarID" style="height:300px;width:auto;"></div> </div> </div> <div class="row"> <div class="col-md-12" style="background-color:white;height:450px;width:auto;border:groove;"> <span style="font-weight:bold">Top 10 Test Performance(sec):</span> <div id="testsBarID" style="height:400px;width:auto;"></div> </div> <div class="col-md-12" style="background-color:white;height:450px;width:auto;border:groove;"> <span style="font-weight:bold">Top 10 Method Performance(sec):</span> <div id="methodsBarID" style="height:400px;width:auto;"></div> </div> </div> <div class="row"> <div class="col-md-12" style="height:25px;width:auto;"> <p class="text-muted" style="text-align:center;font-size:9px">testng-metrics</p> </div> </div> <script> window.onload = function(){ executeDataTable('#cm',3); executeDataTable('#tm',3); executeDataTable('#mm',3); createBarGraph('#cm',0,3,5,'classBarID','Elapsed Time(s): ','Class'); createBarGraph('#tm',1,3,10,'testsBarID','Elapsed Time(s): ','Test'); createBarGraph('#mm',1,3,10,'methodsBarID','Elapsed Time(s): ','Method'); }; </script> </div> <div class="tabcontent" id="classMetrics"> <h4><b><i class="fa fa-table"></i> Class Metrics</b></h4><hr/> <table class="table table-striped table-bordered" id="cm"> <thead><tr> <th>Class Name</th> <th>Total Methods</th> <th>Passed Methods</th> <th>Failed Methods</th> <th>Skipped Methods</th> </tr></thead> <tbody> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.MainClass</td> <td>13</td> <td>12</td> <td>5</td> <td>0</td> </tr> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.SecondClass</td> <td>13</td> <td>12</td> <td>1</td> <td>0</td> </tr> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.ThirdClass</td> <td>13</td> <td>12</td> <td>10</td> <td>0</td> </tr> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.FourthClass</td> <td>13</td> <td>12</td> <td>10</td> <td>0</td> </tr> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.FifthClass</td> <td>13</td> <td>12</td> <td>10</td> <td>0</td> </tr> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.SixthClass</td> <td>13</td> <td>12</td> <td>10</td> <td>0</td> </tr> </tbody> </table> <div class="row"><div class="col-md-12" style="height:25px;width:auto;"></div></div></div> <div class="tabcontent" id="testMetrics"> <h4><b><i class="fa fa-table"></i> Test Metrics</b></h4><hr/> <table class="table table-striped table-bordered" id="tm"> <thead><tr> <th>Class Name</th> <th>Test Name</th> <th>Status</th> <th>Time(s)</th> <th>Error</th> </tr></thead> <tbody> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.MainClass</td> <td style="word-wrap: break-word;max-width: 250px; white-space: normal;">beforeSuite</td> <td>PASS</td> <td>41.609</td> <td></td> </tr> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.MainClass</td> <td style="word-wrap: break-word;max-width: 250px; white-space: normal;">testCaseOne</td> <td>FAIL</td> <td>1.609</td> <td>java.lang.AssertionError</td> </tr> </tbody> </table> <div class="row"><div class="col-md-12" style="height:25px;width:auto;"></div></div></div> <div class="tabcontent" id="methodMetrics"> <h4><b><i class="fa fa-table"></i> Method Metrics</b></h4><hr/> <table class="table table-striped table-bordered" id="mm"> <thead><tr> <th>Class Name</th> <th>Method Name</th> <th>Status</th> <th>Time(s)</th> <th>Error</th> </tr></thead> <tbody> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.MainClass</td> <td style="word-wrap: break-word;max-width: 250px; white-space: normal;">beforeSuite</td> <td>PASS</td> <td>41.609</td> <td></td> </tr> <tr> <td style="word-wrap: break-word;max-width: 200px; white-space: normal">testcase.testOne.MainClass</td> <td style="word-wrap: break-word;max-width: 250px; white-space: normal;">testCaseOne</td> <td>FAIL</td> <td>1.609</td> <td>java.lang.AssertionError</td> </tr> </tbody> </table> <div class="row"><div class="col-md-12" style="height:25px;width:auto;"></div></div></div> <div class="tabcontent" id="log"> <p style="text-align:right">**<b>index.html</b>need to be in current folder in order to display here</p> <div class="embed-responsive embed-responsive-4by3"> <iframe class="embed-responsive-item" src="index.html"></iframe> </div> </div> <div class="tabcontent" id="statistics"> <h4><b><i class="fa fa-envelope-o"></i> Email Statistics</b></h4><hr/> <button class="btn btn-primary active inner" id="create" onclick="updateTextArea();this.style.visibility= 'hidden';" role="button"> <i class="fa fa-cogs"></i> Generate Statistics Email</button> <a class="btn btn-primary active inner" download="message.eml" id="downloadlink" role="button" style="display: none; width: 300px;"> <i class="fa fa-download"></i>Click Here To Download Email</a> <script> function updateTextArea() { var suite = "<b>Top 5 Class Failures:</b><br><br>" + $("#classBarID table")[0].outerHTML; var test = "<b>Top 10 Test Performance:</b><br><br>" + $("#testsBarID table")[0].outerHTML; var test = "<b>Top 10 Method Performance:</b><br><br>" + $("#methodsBarID table")[0].outerHTML; var saluation="<pre><br>Please refer TestNG Metrics Report for detailed statistics.<br><br>Regards,<br>QA Team</pre></body></html>"; document.getElementById("textbox").value += "<br>" + suite + "<br>" + test + "<br>" + keyword + saluation; $("#create").click(function(){ $(this).remove(); }); } </script> <textarea class="col-md-12" id="textbox" style="height: 400px; padding:1em;"> To: myemail1234@email.com Subject: Automation Execution Status X-Unsent: 1 Content-Type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test Email Sample</title> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <meta content="IE=edge" http-equiv="X-UA-Compatible"/> <meta content="width=device-width, initial-scale=1.0 " name="viewport"/> <style> body { background-color:#F2F2F2; } body, html, table,pre,b { font-family: Calibri, Arial, sans-serif; font-size: 1em; } .pastdue { color: crimson; } table { border: 1px solid silver; padding: 6px; margin-left: 30px; width: 600px; } thead { text-align: center; font-size: 1.1em; background-color: #B0C4DE; font-weight: bold; color: #2D2C2C; } tbody { text-align: center; } th { width: 25%; word-wrap:break-word; } </style></head> <body><pre>Hi Team, Following are the last build execution statistics. <b>Metrics:<b> </b></b></pre> <table> <thead> <th style="width: 25%;">Total</th> <th style="width: 25%;">Pass</th> <th style="width: 25%;">Fail</th> <th style="width: 25%;">Skip</th> </thead> <tbody><tr> <td style="text-align: left;font-weight: bold;"> TESTS </td> <td style="background-color: #F5DEB3;text-align: center;">9</td> <td style="background-color: #90EE90;text-align: center;">4</td> <td style="background-color: #F08080;text-align: center;">5</td> </tr></tbody> </table> </body></html></textarea> </div></div> <script> (function () { var textFile = null, makeTextFile = function (text) { var data = new Blob([text], { type: 'text/plain' }); if (textFile !== null) { window.URL.revokeObjectURL(textFile); } textFile = window.URL.createObjectURL(data); return textFile; }; var create = document.getElementById('create'), textbox = document.getElementById('textbox'); create.addEventListener('click', function () { var link = document.getElementById('downloadlink'); link.href = makeTextFile(textbox.value); link.style.display = 'block'; }, false); })(); </script> <script> function createBarGraph(tableID, keyword_column, time_column, limit, ChartID, Label, type) { var status = []; css_selector_locator = tableID + ' tbody >tr' var rows = $(css_selector_locator); var columns; var myColors = ['#4F81BC','#C0504E','#9BBB58','#24BEAA','#8064A1','#4AACC5','#F79647','#815E86','#76A032','#34558B']; status.push([type, Label, {role: 'annotation'}, {role: 'style'}]); for (var i = 0; i < rows.length; i++) { if (i == Number(limit)) { break; } //status = []; name_value = $(rows[i]).find('td'); time = ($(name_value[Number(time_column)]).html()).trim(); keyword = ($(name_value[Number(keyword_column)]).html()).trim(); status.push([keyword, parseFloat(time), parseFloat(time), myColors[i]]); } var data = google.visualization.arrayToDataTable(status); var options = { legend: 'none', chartArea: { width: "92%", height: "75%"}, bar: { groupWidth: '90%'}, annotations: { alwaysOutside: true, textStyle: { fontName: 'Comic Sans MS',fontSize: 13,bold: true,italic: true,color: "black", }, }, hAxis: { textStyle: {fontName: 'Arial',fontSize: 10,} }, vAxis: { gridlines: {count: 10}, textStyle: {fontName: 'Comic Sans MS',fontSize: 10,} }, }; var chart = new google.visualization.ColumnChart(document.getElementById(ChartID)); chart.draw(data, options); } </script> <script> function executeDataTable(tabname, sortCol) { var fileTitle; switch (tabname) { case "#cm": fileTitle = "ClassMetrics"; break; case "#tm": fileTitle = "TestMetrics"; break; default: fileTitle = "metrics"; } $(tabname).DataTable({ retrieve: true, "order": [[Number(sortCol), "desc"]], dom: 'l<".margin" B>frtip', buttons: [ 'copy', { extend: 'csv', filename: function () { return fileTitle + '-' + new Date().toLocaleString(); }, title: '', }, { extend: 'excel', filename: function () { return fileTitle + '-' + new Date().toLocaleString(); }, title: '', }, { extend: 'pdf', filename: function () { return fileTitle + '-' + new Date().toLocaleString(); }, title: '', }, { extend: 'print', title: '', }, ], }); } </script> <script> function openPage(pageName, elmnt, color) { var i, tabcontent, tablinks; tabcontent = document.getElementsByClassName("tabcontent"); for (i = 0; i < tabcontent.length; i++) { tabcontent[i].style.display = "none"; } tablinks = document.getElementsByClassName("tablink"); for (i = 0; i < tablinks.length; i++) { tablinks[i].style.backgroundColor = ""; } document.getElementById(pageName).style.display = "block"; elmnt.style.backgroundColor = color; } // Get the element with id="defaultOpen" and click on it document.getElementById("defaultOpen").click(); </script> <script> document.getElementById("defaultOpen").click(); </script> <script> $(window).on('load',function(){$('.loader').fadeOut();}); </script> </body>