mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-17 04:41:36 +08:00
Merge pull request #1607 from NativeScript/tests-result-in-file
JUnit style tests result to file
This commit is contained in:
@ -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);
|
||||||
|
@ -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;
|
||||||
@ -156,7 +180,7 @@ export var runAll = function (testSelector?: string) {
|
|||||||
// TODO: We may schedule pending run requests
|
// TODO: We may schedule pending run requests
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var singleModuleName, singleTestName;
|
var singleModuleName, singleTestName;
|
||||||
if (testSelector) {
|
if (testSelector) {
|
||||||
var pair = testSelector.split(".");
|
var pair = testSelector.split(".");
|
||||||
@ -168,7 +192,7 @@ export var runAll = function (testSelector?: string) {
|
|||||||
singleModuleName = singleModuleName.toLowerCase();
|
singleModuleName = singleModuleName.toLowerCase();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
singleTestName = pair[1];
|
singleTestName = pair[1];
|
||||||
if (singleTestName) {
|
if (singleTestName) {
|
||||||
if (singleTestName.length === 0) {
|
if (singleTestName.length === 0) {
|
||||||
@ -178,7 +202,7 @@ export var runAll = function (testSelector?: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("TESTS: " + singleModuleName + " " + singleTestName);
|
console.log("TESTS: " + singleModuleName + " " + singleTestName);
|
||||||
|
|
||||||
var totalSuccess = 0;
|
var totalSuccess = 0;
|
||||||
@ -205,7 +229,7 @@ export var runAll = function (testSelector?: string) {
|
|||||||
if (singleTestName && (singleTestName !== testName.toLowerCase())) {
|
if (singleTestName && (singleTestName !== testName.toLowerCase())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var testFunction = test[testName];
|
var testFunction = test[testName];
|
||||||
if ((typeof (testFunction) === "function") && (testName.substring(0, 4) == "test")) {
|
if ((typeof (testFunction) === "function") && (testName.substring(0, 4) == "test")) {
|
||||||
if (test.setUp) {
|
if (test.setUp) {
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user