Тестовете на транспортир се изпълняват успешно, но отчетът за покритие на транспортир е напълно празен

Опитвам се да интегрирам текущия си проект AngularJS с Protractor Coverage. Моля, намерете по-долу package.json и моята конфигурация на транспортир.

Package.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
Можете ли да погледнете във вашата папка coverage/e2e/instrumented, за да видите дали вашите *.js файлове се инструментират? Ако са, ще видите много грозен код в тях. Трябва да настроите приложението си да зарежда тези файлове вместо „нормалните“. След като това работи, проверете ги в програмата за отстраняване на грешки в браузъра си дали вашите тестове всъщност използват инструментираните файлове. В зависимост от вашия сървър/бекенд това може да се направи по много различни начини. Ако използвате node, бих препоръчал да проверите и стартирате примерното приложение, което е пакетирано с кода на Protractor Coverage.   -  person Carl    schedule 28.11.2014
comment
Да, *.js файловете се инструментират и кодът изглежда минимизиран. Използваме зависимостта grunt-protractor-coverage. Но ние получаваме No coverage object в предупреждението на браузъра в конзолата, докато изпълняваме grunt теста.   -  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
да Опитахме с run: {}. Но все още получаваме No coverage object в предупреждението на браузъра в конзолата. Освен това отчетът е празен. - 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. Променливата за покритие не е покритие. Вместо това изглежда има добавени по подразбиране дата/час. Това, което трябва да направите, е да зададете променливата за покритие във вашия gruntfile, под задачата на инструмента, добавете coverageVariable като по-долу.

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

person technimadhu    schedule 31.07.2015