Тесты Protractor выполняются успешно, но отчет о покрытии Protractor полностью пуст.

Я пытаюсь интегрировать свой текущий проект AngularJS с покрытием Protractor. Пожалуйста, найдите ниже package.json и мою конфигурацию транспортира.

Пакет.json

"devDependencies": {
    "chromedriver": "~2.8.1",
    "grunt": "~0.4.0",
    "grunt-contrib-clean": "~0.4.0",
    "grunt-contrib-copy": "~0.5.0",
    "grunt-contrib-jshint": "~0.2.0",
    "grunt-contrib-concat": "~0.1.3",
    "grunt-contrib-uglify": "~0.1.1",
    "grunt-contrib-watch": "~0.3.1",
    "grunt-html2js": "~0.1.0",
    "grunt-karma": "~0.4.4",
    "grunt-protractor-runner": "~1.1.4",
    "grunt-contrib-less": "~0.11.3",
    "grunt-shell": "~0.6.0",
    "selenium": "~2.20.0",
    "grunt-protractor-coverage": "^0.2.1",
    "grunt-istanbul": "^0.2.5",
    "grunt-express-server": "~0.4.5",
    "protractor": "~1.4.0",
    "grunt-contrib-connect": "~0.7.1"
  }

Конфигурация транспортира

exports.config = {

    seleniumServerJar: '../../node_modules/selenium/lib/runner/selenium-server-standalone-2.20.0.jar',
    chromeDriver: '../../node_modules/chromedriver/lib/chromedriver/chromedriver',
    baseUrl: 'http://localhost:3000/',

    capabilities: {
        'browserName': 'chrome',
        'chromeOptions': {
            'args': ['incognito', 'disable-extensions', 'start-maximized']
        }
    },

    onPrepare: function() {
        exports.server = require('../../server.js');
    },

    specs: ['../e2e/**/*.spec.js'],  

    jasmineNodeOpts: {
        onComplete: function () {},
        isVerbose: true,
        showColors: true,
        includeStackTrace: true,
        defaultTimeoutInterval: 90000
    }
};

Мои задания Grunt

grunt.registerTask('test', ['clean:coverage', 'copy:instrument', 'instrument',  'protractor_coverage:chrome', 'makeReport']);

    copy: {
        instrument: {
            files: [{
                src: ['src/app/**/*', '!src/app/**/*.js'],
                dest: 'coverage/e2e/instrumented/'
            }]
        },
    },

    clean: {
        coverage: ['coverage', 'instrumented', 'reports']
    }


    instrument: {
        files: 'src/app/**/*.js',
        options: {
            lazy: true,
            basePath: 'coverage/e2e/instrumented'
        }
    },

    makeReport: {
        src: 'coverage/e2e/instrumented/*.json',
        options: {
            type: 'lcov',
            dir: 'coverage/e2e/reports',
            print: 'detail'             
        }
    },


    protractor_coverage: {
        options: {
            configFile: 'test/config/protractor-config.js', // Default config file
            keepAlive: true, // If false, the grunt process stops when the test fails.
            noColor: false, // If true, protractor will not use colors in its output.
            coverageDir: 'coverage/e2e/instrumented',
            args: {}
        },
        chrome: {
            options: {
                args: {
                    baseUrl: 'http://localhost:3000/',
                    // Arguments passed to the command
                    'browser': 'chrome'
                }
            }
        },
    },

Когда я пытаюсь запустить задание grunt, все тесты выполняются успешно, но отчет о покрытии транспортира совершенно пуст. Я пробовал несколько вариантов, но я не могу сделать так, чтобы отчеты появлялись.

введите здесь описание изображения

Вопрос. Я делаю что-то не так? Как сделать покрытие транспортира для загрузки файлов src js?


person Dinesh ML    schedule 28.11.2014    source источник
comment
Можете ли вы заглянуть в свою папкуcover/e2e/instrumented, чтобы узнать, обрабатываются ли ваши файлы *.js? Если они есть, вы увидите в них много уродливого кода. Вы должны настроить приложение для загрузки этих файлов вместо «обычных». Как только это сработает, проверьте их в отладчике браузера, чтобы ваши тесты действительно использовали инструментированные файлы. В зависимости от вашего сервера/бэкенда это можно сделать разными способами. Если вы используете узел, я бы порекомендовал проверить и запустить образец приложения, упакованный с кодом Protractor Coverage.   -  person Carl    schedule 28.11.2014
comment
Да, файлы *.js инструментируются, и код выглядит минимизированным. Мы используем зависимость grunt-protractor-coverage. Но мы получаем предупреждение об отсутствии покрытия в браузере в консоли во время выполнения теста ворчания.   -  person Dinesh ML    schedule 28.11.2014
comment
Возможно, ваш сервер покрытия не запускается. попробуйте добавить опцию run:{} в конец вашей задачи: код в блоке ответов после этого поста   -  person Carl    schedule 28.11.2014


Ответы (3)


У одного фантастического человека есть хак, который сработал для меня (http://javahow.net/questions/22350680/code-coverage-for-protractor-tests-in-angularjs)

По сути, вы добавляете тест e2e, который записывает собранное покрытие из браузера, примерно так:

'use strict';

var fs = require('fs');

describe('Output the code coverage objects', function() {
  it('should output the coverage object.', function() {
    browser.driver.executeScript("return __coverage__;").then(function(val) {
      fs.writeFileSync("coverage/e2e/coverageE2E.json", JSON.stringify(val));
    });
  });
});

Я также опубликовал это решение для этого вопроса на случай, если оно им тоже поможет: отчет

person simonvandyk    schedule 06.05.2015

Вы можете попробовать добавить run{}, как показано ниже:

protractor_coverage: {
    options: {
        ......
    },
    chrome: {
       ......
    },
    run: {}
},
person Carl    schedule 28.11.2014
comment
да. Мы попробовали запустить: {}. Но все же мы получаем предупреждение об отсутствии покрытия в браузере в консоли. Также отчет пустой. - person Dinesh ML; 28.11.2014
comment
Не могли бы вы уточнить, как подключить/запустить сервер покрытия? - person Dinesh ML; 28.11.2014
comment
спасибо за ваши полезные предложения, и мы успешно создали отчет. - person Dinesh ML; 02.12.2014
comment
Привет, не могли бы вы добавить, как вам в конечном итоге удалось заставить его работать, обновив свой пример или объяснив? Если вы нашли какой-либо совет полезным, пожалуйста, укажите это :) - person Carl; 02.12.2014
comment
Все так же, как в нашем примере, который мы разместили выше. Но мы пропустили копирование файлов библиотеки для перемещения в инструментальную папку для запуска тестового примера e2e. Мы инструментировали только исходные файлы, а не библиотечные файлы. - person Dinesh ML; 03.12.2014
comment
Привет, @DineshML, не могли бы вы рассказать, как вам наконец удалось получить отчет о покрытии. Я застрял с этим, и каждый раз генерируется пустой отчет. Мой файл coverage.json - это просто пустой объект. - person softvar; 13.02.2015
comment
@Carl, добавление этой строки не помогает в создании отчета. Каждый раз, когда я получаю пустой отчет, пустой файл coverage.json. Можете ли вы предложить что-то ценное, как вам удается заставить его работать? - person softvar; 13.02.2015
comment
@DineshML: Можете ли вы подробно рассказать о том, что вы сделали, пожалуйста? - person santon; 21.07.2017

просто хочу добавить к ответу simonvandyk. Переменная покрытия не является покрытием. Вместо этого, похоже, дата/время добавлены по умолчанию. Что вам нужно сделать, так это установить переменную покрытия в вашем файле grunt, в задаче инструмента добавить переменную покрытия, как показано ниже.

instrument: {
        files: ['js/*.js'],
        options: {
            lazy: true,
            basePath: "./instrumented",
            coverageVariable: '__coverage__' //<<--- sets it to specific value
        }
    },

person technimadhu    schedule 31.07.2015