Асинхронная функция в файле grunt - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь внедрить систему маркировки в нашу инфраструктуру функциональной автоматизации.Чтобы заставить его работать так, как мне хотелось бы, я хочу проанализировать опцию grunt, которая появится, выполнить наши тесты для метки и вернуть эти файлы в виде списка для передачи в mochaTest для запуска.Я использую File-Matcher (асинхронный) для grep для тестов.Хотя он работает и правильно выкладывает файлы, которые я хотел бы проверить, он делает это после того, как grunt регистрирует задачи.Я вижу, что grunt поддерживает асинхронные задачи, но я не уверен, как я могу реструктурировать, чтобы поддержать это.Можно ли заставить grunt завершить обработку моей задачи grep, прежде чем начинать извлекать все файлы для тестирования?

Ниже я проверяю grunt.option ('fm').Если это предоставленная опция, я хочу использовать file-matcher, чтобы получить правильные тесты и запустить это подмножество.

Gruntfile выглядит следующим образом:

'use strict';
var fm = require('file-matcher'),
    fmOptions = {
        path: 'tests/',
        recursiveSearch: true,
        fileFilter: {
            fileNamePattern: '**/*.js',
            content: /@foobar/i,
        }
    };

var _ = require('lodash'),
    mochaOptions = {
        ui: 'bdd',
        timeout: 200000,
        reporter: "mocha-multi",
        reporterOptions: {
            xunit: {
                stdout: "tmp/results.xml"
            },
            spec: {
                stdout: "-"
            }
        },
        colors: true
    };

var gruntConfig = {
    env: {
        dev: {
            BASE_URL: "dev"
        },

        test: {
            BASE_URL: "test"
        },

        dynamic: {
            BASE_URL: process.env.DYNAMIC_URL
        },

        chrome: {
            add: {
                chromeDriver: true
            }
        },
        ff: {
            add: {
                ffDriver: true
            }
        },
        ie: {
            add: {
                ieDriver: true
            }
        }
    },
    mochaTest: {
        all: {
            options: mochaOptions,
            src: ['tests/**/*.js']
        },
        a: {
            options: mochaOptions,
            src: ['tests/a/**/*.js']
        },
        b: {
            options: mochaOptions,
            src: ['tests/b/**/*.js']
        }
    }
};

module.exports = function (grunt) {

    var previous_force_state = grunt.option("force");

    grunt.registerTask("force", function (set) {
        if (set === "on") {
            grunt.option("force", true);
        }
        else if (set === "off") {
            grunt.option("force", false);
        }
        else if (set === "restore") {
            grunt.option("force", previous_force_state);
        }
    });


    // eg test:local:chrome --files=test/a/general.js
    if (grunt.option('files')) {
        var filesList = grunt.option('files').split(',');
        gruntConfig.mochaTest.all.src = filesList;
    }

    if (grunt.option('fm')) {
        console.log("chose fm");
        var fileMatcher = new fm.FileMatcher();
        fileMatcher.find(fmOptions).then(function (files) {
            console.log(files);
            gruntConfig.mochaTest.all.src = files;
        });
    }

    // output result XML to a different location
    // e.g. test:chrome:stage ... --output results/test.xml
    if (grunt.option('output')) {
        var outputFile = grunt.option('output');
        mochaOptions.reporterOptions.xunit.stdout = outputFile;
    }

    grunt.initConfig(gruntConfig);
    grunt.loadNpmTasks('grunt-env');
    grunt.loadNpmTasks('grunt-mocha-test');
    grunt.loadNpmTasks('grunt-concurrent');

    // Default task is local chrome test
    grunt.registerTask('default', ['env:chrome', 'mochaTest:all']);

    // Browsers - local
    // eg test:local:chrome:b


    var browserList = ['chrome', 'ff', 'ie'];
    var verticalList = ['a', 'b'];
    var envList = ['dev', 'test', 'dynamic'];

    _.each(browserList, function (browser) {

        grunt.registerTask('test:' + browser, ['env:' + browser, 'mochaTest:all']);

        _.each(envList, function (env) {

            grunt.registerTask('test:' + browser + ':' + env, ['env:' + browser, 'env:' + env, 'mochaTest:all']);

            _.each(verticalList, function (vert) {

                grunt.registerTask('test:' + browser + ':' + env + ':' + vert, ['env:' + browser, 'env:' + env, 'env:' + vert, 'mochaTest:' + vert]);

            });

        });

    });


};

Команда и вывод ниже.Начинается запуск всего набора тестов, а не только файлов, которые мне нужны для запуска.

$ grunt test:chrome:stage --fm '@foobar'
chose fm
Running "env:chrome" (env) task

Running "mochaTest:all" (mochaTest) task

  <first test in suite>.js
[ '<test containing label>.js' ]
...