Merge pull request #1607 from NativeScript/tests-result-in-file

JUnit style tests result to file
This commit is contained in:
dtopuzov
2016-02-23 19:41:09 +02:00
2 changed files with 44 additions and 14 deletions

View File

@ -27,6 +27,7 @@ export interface TestInfoEntry {
isPassed: boolean; isPassed: boolean;
errorMessage: string; errorMessage: string;
testTimeout: number; testTimeout: number;
duration: number;
} }
export function time(): number { export function time(): number {
@ -56,6 +57,7 @@ var runTest = function (testInfo: TestInfoEntry) {
if (testInfo.isTest) { if (testInfo.isTest) {
duration = time() - start; duration = time() - start;
testInfo.duration = duration;
write("--- [" + testInfo.testName + "] OK, duration: " + duration, trace.messageType.info); write("--- [" + testInfo.testName + "] OK, duration: " + duration, trace.messageType.info);
testInfo.isPassed = true; testInfo.isPassed = true;
} }
@ -63,6 +65,7 @@ var runTest = function (testInfo: TestInfoEntry) {
catch (e) { catch (e) {
if (testInfo.isTest) { if (testInfo.isTest) {
duration = time() - start; duration = time() - start;
testInfo.duration = duration;
write("--- [" + testInfo.testName + "] FAILED: " + e.message + ", duration: " + duration, trace.messageType.error); write("--- [" + testInfo.testName + "] FAILED: " + e.message + ", duration: " + duration, trace.messageType.error);
testInfo.isPassed = false; testInfo.isPassed = false;
testInfo.errorMessage = e.message; testInfo.errorMessage = e.message;
@ -109,6 +112,7 @@ function runAsync(testInfo: TestInfoEntry, recursiveIndex: number, testTimeout?:
let duration; let duration;
var checkFinished = function () { var checkFinished = function () {
duration = time() - testStartTime; duration = time() - testStartTime;
testInfo.duration = duration;
if (isDone) { if (isDone) {
write("--- [" + testInfo.testName + "] OK, duration: " + duration, trace.messageType.info); write("--- [" + testInfo.testName + "] OK, duration: " + duration, trace.messageType.info);
//write("--- [" + testInfo.testName + "] took: " + (new Date().getTime() - testStartTime), trace.messageType.info); //write("--- [" + testInfo.testName + "] took: " + (new Date().getTime() - testStartTime), trace.messageType.info);

View File

@ -5,6 +5,7 @@ import {topmost, Frame} from "ui/frame";
import {TextView} from "ui/text-view"; import {TextView} from "ui/text-view";
import * as platform from "platform"; import * as platform from "platform";
import "./ui-test"; import "./ui-test";
import fs = require("file-system");
Frame.defaultAnimatedNavigation = false; Frame.defaultAnimatedNavigation = false;
@ -113,20 +114,37 @@ var running = false;
var testsQueue = new Array<TestInfo>(); var testsQueue = new Array<TestInfo>();
function printRunTestStats() { function printRunTestStats() {
let testFileContent = new Array<string>();
var j; var j;
var testsCount = 0;
var failedTestCount = 0; var failedTestCount = 0;
var failedTestInfo = []; var failedTestInfo = [];
for (j = 0; j < testsQueue.length; j++) {
if (testsQueue[j].isTest) { let allTests = testsQueue.filter(t=> t.isTest);
testsCount++;
if (!testsQueue[j].isPassed) { testFileContent.push("<testsuites>");
failedTestCount++; testFileContent.push(`<testsuite name="NativeScript Tests" timestamp="${new Date()}" hostname="hostname" time="0" errors="0" tests="${allTests.length}" skipped="0" failures="${failedTestCount}">`);
failedTestInfo.push(testsQueue[j].testName + " FAILED: " + testsQueue[j].errorMessage);
} for (j = 0; j < allTests.length; j++) {
let testName = allTests[j].testName;
let duration = allTests[j].duration / 1000;
if (!allTests[j].isPassed) {
failedTestCount++;
let errorMessage = allTests[j].errorMessage;
failedTestInfo.push(allTests[j].testName + " FAILED: " + allTests[j].errorMessage);
testFileContent.push(`<testcase classname="classname" name="${testName}" time="${duration}"><failure type="exceptions.AssertionError">${errorMessage}</failure></testcase>`);
} else {
testFileContent.push(`<testcase classname="classname" name="${testName}" time="${duration}"></testcase>`);
} }
} }
let finalMessage = "=== ALL TESTS COMPLETE === \n" + (testsCount - failedTestCount) + " OK, " + failedTestCount + " failed" + "\n";
let finalMessage = "=== ALL TESTS COMPLETE === \n" + (allTests.length - failedTestCount) + " OK, " + failedTestCount + " failed" + "\n";
TKUnit.write(finalMessage, messageType.info); TKUnit.write(finalMessage, messageType.info);
for (j = 0; j < failedTestInfo.length; j++) { for (j = 0; j < failedTestInfo.length; j++) {
let failureMessage = failedTestInfo[j]; let failureMessage = failedTestInfo[j];
@ -134,6 +152,12 @@ function printRunTestStats() {
finalMessage += "\n" + failureMessage; finalMessage += "\n" + failureMessage;
} }
testFileContent.push("</testsuite>");
testFileContent.push("</testsuites>");
let testFile = fs.File.fromPath(fs.path.join(fs.knownFolders.documents().path, "test-results.xml"));
testFile.writeTextSync(testFileContent.join(""));
let messageContainer = new TextView(); let messageContainer = new TextView();
messageContainer.text = finalMessage; messageContainer.text = finalMessage;
topmost().currentPage.content = messageContainer; topmost().currentPage.content = messageContainer;
@ -240,8 +264,9 @@ class TestInfo implements TKUnit.TestInfoEntry {
isPassed: boolean; isPassed: boolean;
errorMessage: string; errorMessage: string;
testTimeout: number; testTimeout: number;
duration: number;
constructor(testFunc, testInstance?: any, isTest?, testName?, isPassed?, errorMessage?, testTimeout?) { constructor(testFunc, testInstance?: any, isTest?, testName?, isPassed?, errorMessage?, testTimeout?, duration?) {
this.testFunc = testFunc; this.testFunc = testFunc;
this.instance = testInstance || null; this.instance = testInstance || null;
this.isTest = isTest || false; this.isTest = isTest || false;
@ -249,5 +274,6 @@ class TestInfo implements TKUnit.TestInfoEntry {
this.isPassed = isPassed || false; this.isPassed = isPassed || false;
this.errorMessage = errorMessage || ""; this.errorMessage = errorMessage || "";
this.testTimeout = testTimeout; this.testTimeout = testTimeout;
this.duration = duration;
} }
} }