9

我正在angularJS應用程序中使用量角器運行一些e2e測試(在angularJS文檔中推薦)。 我已經搜索並找不到任何關於如何測量量角器測試覆蓋率的信息。AngularJS中量角器測試的代碼覆蓋率

我想我在這裏失去了一些東西......有沒有什麼辦法得到量角器e2e測試的代碼覆蓋率報告?或者它僅僅是單元測試的一個特性?

+0

IMO,代碼覆蓋率的單元測試,而不是E2E測試。 –

+0

@YeLiu,你能解釋一下你爲什麼這麼想嗎? – eflat

回答

1

我設法讓它工作,但這是一個黑客現在。我使用現有的grunt istanbul插件之一來測試代碼。然後我製作了一個虛擬規格,抓取'覆蓋範圍'全局變量並將其寫入文件。之後,您可以使用任何報告插件創建報告。

(非常過於簡單化)的測試看起來像:

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

爲了增加ryanb的回答,我還沒有試過,但你應該能夠使用類似gulp-istanbul儀器代碼和覆蓋default coverage variable,然後在Protractor配置文件的jasmineNodeOpts對象上定義一個onComplete函數。在一切都關閉之前它會被調用一次。

exports.config = { 

    // ... 

    jasmineNodeOpts: { 
    onComplete: function(){ 
     browser.driver.executeScript("return __coverage__;").then(function(val) { 
     fs.writeFileSync("/path/to/coverage.json", JSON.stringify(val)); 
     }); 
    } 
    } 
}; 
4

如果你正在使用咕嚕 - 您可以使用grunt-protractor-coverage插件,它會爲你做的工作。您將必須先編寫代碼,然後使用所提到的插件爲您創建覆蓋率報告。

2

我最初嘗試了由daniellmb建議的onComplete方法,但如果在測試過程中存在多個頁面加載,則僅在最後獲取覆蓋率結果將不會包含所有結果。這裏有一個總結我如何工作的基本要點,但基本上我必須創建一個記者,每次規格說明完成時,將記錄結果添加到instanbul收集器,然後用onComplete方法編寫報告。我還必須使用「waitPlugin」as suggested by sjelin來防止量角器在寫入結果之前退出。

https://gist.github.com/jbarrus/286cee4294a6537e8217

7

這是可以實現的使用Istanbul。下面是這個過程中,與我從我們的項目中提取一些示例性配置(未測試):使用命令istanbul instrument

  1. 儀器代碼。確保伊斯坦布爾的覆蓋範圍變量爲__coverage__

    // gulpfile.js 
    
    gulp.task('concat', function() { 
        gulp.src(PATH.src) 
         // Instrument for protractor-istanbul-plugin: 
         .pipe(istanbul({coverageVariable: '__coverage__'})) 
         .pipe(concat('scripts.js')) 
         .pipe(gulp.dest(PATH.dest)) 
    }); 
    
  2. 配置量角器與插件protractor-istanbul-plugin

    // spec-e2e.conf.js 
    var istanbulPlugin = require('protractor-istanbul-plugin'); 
    
    exports.config = { 
        // [...] 
        plugins: [{ inline: istanbulPlugin }] 
    }; 
    
  3. 運行您的測試。

  4. 使用istanbul report來提取報告。

這種方法適用於我,很容易與單元測試的覆蓋率報告相結合。要自動完成,我已經把第1步到我gulpfile.js步和第3和第4的testposttest腳本package.json,或多或少是這樣的:

// In package.json: 
"scripts": { 
    "test": "gulp concat && protractor tests/spec-e2e.conf.js", 
    "posttest": "istanbul report --include coverage/**/.json --dir reports/coverage cobertura" 
}, 
+0

你能分享一個樣本'gulpfile.js'嗎?我無法在瀏覽器中獲得覆蓋範圍變量。謝謝。 – ezequielc

+0

@ezequielc更新了示例配置的答案。希望能幫助到你! –

+0

謝謝@ dag-høidahl。直到我刪除'.pipe(istanbul.hookRequire())'後,我的工具文件才被生成,就像你的例子。乾杯 – ezequielc