Nodejs分支测试不会通过命令" grunt fileName"执行。

时间:2014-07-07 10:40:44

标签: node.js git testing jenkins gruntjs

我的nodejs git branches test有问题。这是代码:

var exec = require('child_process').exec;
var request = require('request');
var cheerio = require('cheerio');  
var async = require('async');
var currentDir = ""; // dir
var getBranches = "git for-each-ref --sort=-committerdate refs/remotes/origin/ --format='%(refname:short)'";
var getAuthors = "git for-each-ref --sort=-committerdate refs/remotes/origin/  --format='%(committername)'";
var branches = [];
var errorBranches = [];
var authors = [];
var manager = [];
var result = [];
var fs = require('fs');
var openedBranches = "";
var outFile = 'BranchesTest-results.xml';
var failuresFound = false;

function eliminateDuplicates(arr) {
'use strict';
var i,
    out = [],
    obj = {};

for (i = 0; i < arr.length; i++)
    obj[arr[i]] = 0;

for (i in obj) {
    if (obj.hasOwnProperty(i))
        out.push(i);
}

return out;
}

function showBranchesStats(branches, cb) {
'use strict';
console.log("in showBranchesStats method\n");
var branchesName = [];
var committers = [];
var temp = [];

var j = 0,
    k = 0;

for (var i = 0; i < branches.length; i++) {
    var filter = branches[i].match(/(md|dr)[_\-](\d+)/i);

    if (filter !== null) {
        filter = filter[1] + '-' + filter[2];
        temp[j] = authors[i];
        branchesName[j++] = filter;
    }
    else {
        if (!branches[i].match(/(develop|master|HEAD)/ig))
            errorBranches[k++] = branches[i];
    }
}

var obj = {};

for (i = 0; i < branchesName.length; i++)
    obj[branchesName[i]] = 0;

for (i in obj) {
    if (obj.hasOwnProperty(i))
        committers.push(temp[branchesName.indexOf(i)]);
}

branchesName = eliminateDuplicates(branchesName);
errorBranches = eliminateDuplicates(errorBranches);

var closedBranches = [];
var tasks = [];
j = 0;

for (i = 0; i < branchesName.length; i++) {
    tasks.push(getTask(i));
}
tasks[0]();

var endedCounter = 0;

function onEnd() {
    if (++endedCounter < branchesName.length) {
        console.log(endedCounter + '/' + branchesName.length);
        tasks[endedCounter]();
        return;
    }
    console.log("All requests finished\n");
    for (var i = 0; i < manager.length; i++) {
        result[i] = [];
        result[i] = closedBranches[i].slice(0, -1).split("\n");
    }
    TestResult(cb);
}

function getTask(i) {
    return function () {
        console.log("Request #" + i + "\n");
        request('SERVERNAME' + branchesName[i] + '?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs', function (error, response, html) {
            if (!error && response.statusCode === 200) {
                var $ = cheerio.load(html);
                try {
                    var data = $('.actionContainer:contains("Closed")');

                    if (data.length > 0) {
                        //var _manager = ('not(.twixi-wrap)', data).last().children().eq(0).children().children().eq(0).text();
                        var _manager = committers[i];
                        var _hasClosed = ('not(.twixi-wrap)', data).last().find(".activity-new-val").text().indexOf("Closed");

                        if (_manager && _hasClosed) {
                            var flag = false;

                            for (var s = 0; s < manager.length; s++)
                                if (manager[s] === _manager)
                                    flag = true;

                            if (_hasClosed !== -1) {
                                if (j >= 0 && flag === false) {
                                    manager[j++] = _manager;
                                    closedBranches[manager.indexOf(_manager)] = "";
                                }
                                closedBranches[manager.indexOf(_manager)] += "SERVERNAME" + $('title').text().substring(2, 9) + "\n";
                            }
                            else
                                openedBranches += "SERVERNAME" + $('title').text().substring(2, 9) + " --- OPENED [OK] ----\n";
                        }
                    }
                    else
                        openedBranches += "SERVERNAME" + $('title').text().substring(2, 9) + " --- OPENED [OK] ----\n";
                }
                catch (ex) {
                    console.log("Something wrong happened with your request. Details: " + ex);
                }
                onEnd();
            }
            else {
                console.log("Something wrong happened with your request. Details: " + error);
                failuresFound = true;
                cb();
            }
        });
    };
}
}

function TestResult(cb) {
'use strict';
console.log("Results file constructing started\n");
outFile = fs.openSync(outFile, 'w');
fs.writeSync(outFile, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
fs.writeSync(outFile, "<testsuites>\n");

for (var i = 0; i < manager.length; i++) {
    fs.writeSync(outFile, "\t<testsuite name=\"" + manager[i] + "\">\n");

    for (var j = 0; j < result[i].length; j++) {
        fs.writeSync(outFile, "\t\t<testcase name=\"" + result[i][j] + "\">\n");
        fs.writeSync(outFile, "\t\t\t<failure message=\"Branch Test Failure\">\n");
        fs.writeSync(outFile, "\t\t\t\tError! Found closed branch: " + result[i][j] + "\n");
        fs.writeSync(outFile, "\t\t\t</failure>\n");
        fs.writeSync(outFile, "\t\t</testcase>\n");
        failuresFound = true;
    }

    fs.writeSync(outFile, "\t</testsuite>\n");
}

console.log("\nOpened branches: \n\n" + openedBranches);

if (!failuresFound) {
    fs.writeSync(outFile, "\t<testsuite name=\"BranchTest\">\n");
    fs.writeSync(outFile, "\t\t<testcase name=\"BranchTest\"/>\n");
    fs.writeSync(outFile, "\t</testsuite>\n");
}

fs.writeSync(outFile, "</testsuites>");
fs.closeSync(outFile);

console.log("\nError branches: \n");
for (var k = 0; k < errorBranches.length; k++)
    console.log(errorBranches[k]);

console.log('Test result : ' + (failuresFound ? '' : 'no ') + 'failures found');
cb();
}

this.check = function () {
'use strict';
console.log("Execution started\n");
var funcs = [
    function (cb) {
        console.log('started 1');
        exec(getAuthors, {cwd: currentDir}, function (error, stdout, stderr) {
            console.log('started 1.1');
            if (stderr) {
                console.log('stderr: ' + stderr + "\n");
                failuresFound = true;
                cb();
            }
            else {
                authors = stdout.split('\n');
                console.log("Authors has been received\n");
                cb();
            }
            if (error !== null) {
                console.log('Execution command error: ' + error + "\n");
                failuresFound = true;
                cb();
            }
        });
    },

    function (cb) {
        console.log('started 2');
        exec(getBranches, {cwd: currentDir}, function (error, stdout, stderr) {
            console.log("started 2.1");
            if (stderr) {
                console.log('stderr: ' + stderr + "\n");
                failuresFound = true;
                cb();
            }
            else {
                branches = stdout.split('\n');
                console.log("Going to showBranchesStats method\n");
                showBranchesStats(branches, cb);
            }
            if (error !== null) {
                console.log('Execution command error: ' + error + "\n");
                failuresFound = true;
                cb();
            }
        });
    }
];

console.log('async.waterfall');
async.waterfall(funcs, function () {
    console.log("Execution finished\n");
    return !failuresFound;
});
};

它&#39;所有工作都在本地完美,但是当我试图在命令行或Jenkins上运行它时,这样:

grunt test_Branches
发生了错误的事情&amp;我得到这个日志:

+ npm i
+ grunt test_Branches
[4mRunning "test_Branches" task[24m
Execution started

async.waterfall
Done, without errors.

帮助,请!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。解决方案是here

您需要正确使用异步函数。