Я пытаюсь внедрить систему маркировки в нашу инфраструктуру функциональной автоматизации.Чтобы заставить его работать так, как мне хотелось бы, я хочу проанализировать опцию 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' ]